求教DbProviderFactory的问题

niss 2013-02-13 04:13:16
微软通过DbProviderFactory帮助我们实现数据库无关性编程,今天在用这个东西改以前的DbHelper类,突然发现几个地方都没有搞明白:
首先,DbHelper实例创建的时候会自动创建一个Connection私有对象,通过复用这个对象可以避免频繁创建Connection的时间和性能损耗(我是这么认为的,但我不确定通过DbProviderFactory.CreateConnection是不是直接从连接池拿,是不是不存在这方面的顾虑)
那么,在重写ExecuteReader的时候,由于流数据的特性,一般都是要读取完毕才关闭连接对象,那么,产生了一个钻牛角尖的问题,这个Helper实例如何实现线程安全....,比如一个线程正在读reader,另一个线程却要用这个connection去执行其他命令....这种情况不就.....,是否要自己实现连接池?O,MyGod
求各路英雄指教一二,我相信ADO.NET这么多年了,大家应该都非常熟悉了,请大家不吝赐教
...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongdongdongJL 2014-08-04
  • 打赏
  • 举报
回复
open,和dispose不是一回事,一个是处理与数据库的链接,一个是处理数据库的对象,是两个概念的!
niss 2013-02-13
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
引用 楼主 niss 的回复:那么,在重写ExecuteReader的时候,由于流数据的特性,一般都是要读取完毕才关闭连接对象,那么,产生了一个钻牛角尖的问题,这个Helper实例如何实现线程安全....,比如一个线程正在读reader,另一个线程却要用这个connection去执行其他命令....这种情况不就.....,是否要自己实现连接池?O,MyGod 简单来……
我想知道conn.Close()和conn.Dispose()的区别,同一个conn频繁new和频繁open是一码事吗?
  • 打赏
  • 举报
回复
引用 楼主 niss 的回复:
那么,在重写ExecuteReader的时候,由于流数据的特性,一般都是要读取完毕才关闭连接对象,那么,产生了一个钻牛角尖的问题,这个Helper实例如何实现线程安全....,比如一个线程正在读reader,另一个线程却要用这个connection去执行其他命令....这种情况不就.....,是否要自己实现连接池?O,MyGod
简单来说,使用ADO.NET并且高并发地复用物理连接,就要注意写类似
using(var conn= CreateDbConnection(conStr))
{
    conn.Open();
    var comm= conn.CreateDbCommand();
    comm.CommandText=.........
    .........
}
这类代码,要确保及时关闭DbConnection,这才能保证复用物理连接。 对于 SqlConnection 你不需要实现什么连接池,因为它就是基于连接池的。如果你搞什么“私有DbConnection,复用这个对象,避免频繁.....”那才真是画蛇添足地,你这个说法才是让它的连接池失效的!
  • 打赏
  • 举报
回复
引用 3 楼 niss 的回复:
using (DbCommand command = CreateDbCommand(sql, parameters, commandType)) { command.Connection.Open(); object result = command.ExecuteScalar(); command.Connection.Close(); return result; } 这种写法,command的connection对象会释放吗?
那你能够说明你所谓的“释放”是什么意思?你连自己所说的“释放”的内涵都无法解释正确,别人无法真正正确地按照你的口味回答你的问题。
  • 打赏
  • 举报
回复
引用 楼主 niss 的回复:
首先,DbHelper实例创建的时候会自动创建一个Connection私有对象,通过复用这个对象可以避免频繁创建Connection的时间和性能损耗(我是这么认为
谁跟你说的“复用这个对象避免频繁创建Connection”? 使用SqlConnection等等连接对象的原则就是不要画蛇添足地“复用”什么Connection,而要及时Close,经常Open。
dalmeeme 2013-02-13
  • 打赏
  • 举报
回复
引用 3 楼 niss 的回复:
另外 using (DbCommand command = CreateDbCommand(sql, parameters, commandType)) { command.Connection.Open(); object result = command.ExecuteScalar(); command.Connection.Close();……
正常情况下会关闭连接,不过如果object result = command.ExecuteScalar(); 这句有异常的话连接就没关闭。
dalmeeme 2013-02-13
  • 打赏
  • 举报
回复
你可以自己写个简单代码测试一下,反复执行多少次,花了多少时间。不过我估计你说的这个效率应该不是问题,性能损失微乎其微,完全可以忽略,当然个人看法而已。
niss 2013-02-13
  • 打赏
  • 举报
回复
另外 using (DbCommand command = CreateDbCommand(sql, parameters, commandType)) { command.Connection.Open(); object result = command.ExecuteScalar(); command.Connection.Close(); return result; } 这种写法,command的connection对象会释放吗?
niss 2013-02-13
  • 打赏
  • 举报
回复
引用 1 楼 dalmeeme 的回复:
这个周公写的数据库访问通用类,可以参考一下:http://blog.csdn.net/zhoufoxcn/article/details/6630524
我比较关心的是在执行command命令时利用工厂实时创建Connection对象的效率如何,周公这个就是如此,我不知道在性能的损耗上是不是很大?
dalmeeme 2013-02-13
  • 打赏
  • 举报
回复
这个周公写的数据库访问通用类,可以参考一下:http://blog.csdn.net/zhoufoxcn/article/details/6630524

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧