是否可以打开SQL连接?

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

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

还要考虑大多数数据库(即SQL Server)在内部使用连接池 ,因此即使您关闭数据库连接,它也会回到池中而不是物理上关闭 – 池管理物理数据库连接 – 这样会更好性能,因此减少了快速打开/关闭连接的影响。

来自MSDN :

连接池减少了必须打开新连接的次数。 pooler保持物理连接的所有权。 它通过为每个给定的连接配置保持一组活动连接来管理连接。 每当用户在连接上调用Open时,pooler将在池中查找可用连接。 如果池连接可用,则将其返回给调用者而不是打开新连接。 当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是关闭它。 一旦连接返回到池,就可以在下一个Open调用中重用它。

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

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

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

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

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

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

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

干杯!