是否可以打开SQL连接?

时间:2011-08-16 01:13:11

标签: c# sql connection

我正在通过com端口连续接收数据并进行一些解码。解码完成后,我必须将结果存储在sql数据库中。我在想,因为解码完成(在一个while循环中总是运行)每秒几十次,如果打开和关闭与sql server的连接是明智的,那么每秒需要将数据存储到数据库十几次。每个while循环或只是让它打开并继续将数据写入数据库。 首先是这可能吗?其次,如果连接保持打开,第三方应用程序或计算机可以同时访问数据库并读取数据,因为我的程序存储数据?

4 个答案:

答案 0 :(得分:8)

数据库支持多个并发连接,所以是的,在这种情况下,保持数据库连接处于打开状态是非常可行的 - 如果你有一个长时间运行的查询导致行/表锁定,你只能锁定其他连接。完成后只需关闭连接即可。

同时考虑大多数数据库(即SQL Server)在内部使用connection pooling,因此即使关闭数据库连接,它也只是返回池并且没有物理关闭 - 池管理物理数据库连接 - 这样可以获得更好的性能,因此可以减少快速打开/关闭连接的影响。

来自MSDN

  

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

答案 1 :(得分:3)

我打开连接,根据需要多次循环,然后关闭连接。打开和关闭非常昂贵。但是,多亏了Mitch Wheat和Dave Markle,我已经了解到连接池是在.NET的后台免费完成的,因此费用应该在所有请求中分摊。

更好的是,我会在循环中批量处理请求并在循环完成后执行批处理。您只需要一次往返网络。

如果您同意最后一点,我会确保批处理INSERT在事务上下文中完成,因此它可以作为单个工作单元提交或回滚。隔离和线程安全很重要。

答案 2 :(得分:0)

我个人每次都会打开和关闭连接。您应该以任何异常最终关闭连接的方式保护您的代码。您的应用程序是否是与此数据库通信的唯一应用程序?

答案 3 :(得分:0)

实际上你必须显式关闭SqlConnection.Open()

从MSDN,“注意如果SqlConnection超出范围,则不会关闭。因此,您必须通过调用Close或Dispose显式关闭连接。”

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.71).aspx

干杯!