使用sqlcommand. ExecuteNonQuery()方式向数据库插入数据,如果是每次插入数据的时间间隔很短;数据库连接保持时间该如何控制

ahking 11 11  2013-01-23 09:44:29
使用sqlcommand. ExecuteNonQuery()方式向数据库插入数据,如果是每次插入数据的时间间隔很短;数据库连接保持时间该如何控制;
是每次插入数据时都open数据库连接,插入完成后关闭数据库连接好,还是一直保持数据库连接状态所消耗的资源小点?
令外问下,使用
using (SqlCommand insertCMD = new SqlCommand())
{
conn.open();
.....
}
时,每次插入数据后,是不是就自动断开数据库连接了,我知道使用
using (SqlConnection conn = new SqlConnection())
后会自动断开数据库连接
...全文
175 11 点赞 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
加油馒头 2013-01-24
用时打开,用完关闭是比较好的选择 不要一直保持连接
  • 打赏
  • 举报
回复
oiuyt89561 2013-01-24
干什么要保持连接啊,多占用资源啊,你要是想时间长点就不要用using语句了,直接用普通的方法写的了吧,自己控制什么时候关闭
  • 打赏
  • 举报
回复
phommy 2013-01-24
引用 9 楼 ahking 的回复:
引用 7 楼 phommy 的回复:我习惯上是拼长sql,这样有很多好处,比如不但只需要一个数据库连接,应用服务器与数据库也只有一次交互,合并交互总是能节省时间。并且这样可以把构造sql语句的过程完整的放在事务外,最大限度防止死锁。如果你每句一提交,不可避免的要在启动事务后再去花时间构造sql。 var sql=@" begin insert...; ……
如果做了汇总定时提交就不存在你说的问题了,或者你觉得有必要要为两个相隔时间很长但执行时间很短的sql共享连接?
  • 打赏
  • 举报
回复
ahking 2013-01-24
引用 7 楼 phommy 的回复:
我习惯上是拼长sql,这样有很多好处,比如不但只需要一个数据库连接,应用服务器与数据库也只有一次交互,合并交互总是能节省时间。并且这样可以把构造sql语句的过程完整的放在事务外,最大限度防止死锁。如果你每句一提交,不可避免的要在启动事务后再去花时间构造sql。 var sql=@" begin insert...; delete...; if..……
莫名其妙,你怎么看出我每句一提交了
  • 打赏
  • 举报
回复
ahking 2013-01-24
由于我使用socket异步编程,这就涉及到了多线程连接的问题,以下是我从网上摘的内容: “ 多线程调用我也做了测试,这里不贴代码了,我大概讲一下结果。如果是多线程访问 SqlConnection ,注意是通过 new SqlConnection 方式访问, 那么这里有两个问题,如果后一个线程在前一个线程 Close 前调用了Open操作,那么 Ado.net 不可能复用一个物理连接,它将为第二个线程分配一个新的物理连接。如果后一个线程 Open 时,前一个线程已经 Close 了,则新的线程使用前一个线程的物理连接。也就是说,如果同时有n个线程连接数据库,最多情况下会创建n条物理连接,最少情况下为1条。如果创建n条物理连接,则用时理论上等于 n * t / cpu , n 为线程数,t 为每次创建物理连接的用时,前面测试的结果大概是5-10ms左右,cpu 为当前机器的CPU数量。另外网络,服务器的负荷也影响这个用时。为了保证在大并发时,尽量少的创建新的物理连接,我们可以适当把 Min Pool Size 调大一些,但也不要太大,因为单个机器TCP链路的数量是有限的 ” 我现在想知道,Min Pool Size 设置多大合适,极端的最大并发连接能到50个
  • 打赏
  • 举报
回复
phommy 2013-01-24
我习惯上是拼长sql,这样有很多好处,比如不但只需要一个数据库连接,应用服务器与数据库也只有一次交互,合并交互总是能节省时间。并且这样可以把构造sql语句的过程完整的放在事务外,最大限度防止死锁。如果你每句一提交,不可避免的要在启动事务后再去花时间构造sql。 var sql=@" begin insert...; delete...; if....; end; "; using(SqlCommand...
  • 打赏
  • 举报
回复
ahking 2013-01-24
但是程序一般不停的向数据库写数据; 按sp1234所说,十万次共享一个连接和新建十万个连接是一样的, 真是这样么?
  • 打赏
  • 举报
回复
ahking 2013-01-23
在开始的时候, sql server 进程也就占到了200M的内存。
  • 打赏
  • 举报
回复
ahking 2013-01-23
引用 1 楼 sp1234 的回复:
SqlConnection基于连接池。你new一个对象以及调用其Open的时候,你不用管它是第一次打开物理连接还是第十万次共享一个物理连接,你都可以把它当作新的连接。 本来这是一个让你傻瓜化从而可以把精力放在更重要的事情上的设计,.net framework处处都可找到这类经验积累出来的自动化的聪明设计,希望不要让你真的傻瓜化了。
感觉你一下就能说到根上,我现在担心的就是SqlConnection在打开后,如何及时释放的问题; 多线程连接数据库,是每次都打开一个新的SqlConnection连接还是都可以共用一个数据库连接好一些? 我的sql server 进程占到了1G以上的内存。 因为多进程连接数据库,都使用相同的连接字符串,总感觉这方面有优化的空间,还是直接using(SqlConnection conn...) 算了
  • 打赏
  • 举报
回复
Hauk 2013-01-23
using (SqlCommand insertCMD = new SqlCommand()) { conn.open(); ..... } 不会关闭连接,但如果你SqlConnection是在方法中声明的话,离开方法后也会释放对象。 不管时间多短都调用conn.Close()比较好,这样有利于连接及时回归连接池,更加科学。 (当然也不排除一些特殊情况,比如单用户操作或用户很少的话长开着也没什么问题的)
  • 打赏
  • 举报
回复
SqlConnection基于连接池。你new一个对象以及调用其Open的时候,你不用管它是第一次打开物理连接还是第十万次共享一个物理连接,你都可以把它当作新的连接。 本来这是一个让你傻瓜化从而可以把精力放在更重要的事情上的设计,.net framework处处都可找到这类经验积累出来的自动化的聪明设计,希望不要让你真的傻瓜化了。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2013-01-23 09:44
社区公告

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