首页 新闻 会员 周边

.NET 连接数据库,连上了就不要让它轻易断开,符合大型软件设计吗?

0
悬赏园豆:20 [已解决问题] 解决于 2013-09-20 12:15

各位:

     我是新人!

  我一直都是听别人说,操作数据库的时候,如果一旦让connection连接上了数据库,就不要让它轻易断开,否则很浪费资源;所以很多DBHelper才使用了蛮多的static方法,我想问问各位是这样子的吗?

John.Xiong的主页 John.Xiong | 菜鸟二级 | 园豆:302
提问于:2013-09-19 12:13
< >
分享
最佳答案
1

恰恰相反,在使用连接池的情况(ADO.NET的默认情况)下,连接要尽可能早地断开,一完成数据库操作就要立即断开。

收获园豆:10
dudu | 高人七级 |园豆:31003 | 2013-09-19 12:21

那我看了很多网上的DBHelper都大部分写的是static,不用new,很多也不关闭,不dispose,这些设计规范吗?不知道您是否有推荐的文章,让我学习下

John.Xiong | 园豆:302 (菜鸟二级) | 2013-09-19 12:27

@John.Xiong: 这与DBHelper是否是static没有关系,关闭连接在方法中进行的,比如:DBHelper.ExecuteReader()。

dudu | 园豆:31003 (高人七级) | 2013-09-19 13:20
其他回答(3)
0

一般都是用完就关闭啦,这应该是最好的方案。

再说你也不一定保证它保持连接状态,因为数据库也是有连接过期限制的。

kaleyroy | 园豆:360 (菜鸟二级) | 2013-09-20 08:52
0

我觉得这个不好说,我觉得socket的连接是蛮要资源的。如果是同一个客户端,执行一次查询就关闭的话,也是很浪费资源的。应该有一个timeout的变量来调节,多久没操作就关连接。

收获园豆:5
angelshelter | 园豆:9887 (大侠五级) | 2013-09-20 10:03

连接池会保持住池中数据库连接的TCP连接

支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2013-09-20 10:28

@dudu: 连接池只是维持线程不释放吧,做好线程资源重复利用。如果你连接断了的话,肯定是要新建socket的

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2013-09-20 10:32

@angelshelter: 你在ADO.NET中关闭数据库连接,只是把该连接还给连接池,该连接继续保持着数据库连接,其他线程可以继续使用这个连接。

支持(0) 反对(1) dudu | 园豆:31003 (高人七级) | 2013-09-20 10:36

@dudu:您只说对了前半部分,后半部分说错了,using 执行完以后,连接状态已经处于关闭状态,而且所占用的资源也已经释放了

支持(0) 反对(0) 誉尚学教育 | 园豆:226 (菜鸟二级) | 2013-09-20 11:49

谢谢您的回复

支持(0) 反对(0) John.Xiong | 园豆:302 (菜鸟二级) | 2013-09-20 12:16

@蓝色天空__任我行: 只是释放给了连接池,这是经过实践检验过的

支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2013-09-20 12:40

@dudu: 可是我我打过断点看过了,using 结束后,Connetion.State 状态的确为Close

支持(0) 反对(0) 誉尚学教育 | 园豆:226 (菜鸟二级) | 2013-09-21 09:33
0

连接还是需要尽快关闭吧,占用连接数对并发不利。对于static方法,不代表就没关闭连接,很多DBHelper采用using(var conn=new SqlConnection(ConString))这样的的写法,这个能自动释放连接了。所以有时看不到手动释放的代码。

收获园豆:5
幻天芒 | 园豆:37175 (高人七级) | 2013-09-20 12:07

谢谢您的回复

支持(0) 反对(0) John.Xiong | 园豆:302 (菜鸟二级) | 2013-09-20 12:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册