保持 SQL 连接开启是否可行?

8

我通过com端口连续接收数据并进行解码。当解码完成后,我需要将结果存储到SQL数据库中。我在考虑,由于解码是在while循环中持续进行的,每秒钟会进行数十次解码,并且数据需要每秒钟写入数据库数十次,如果在每个while循环中打开和关闭与SQL服务器的连接是否明智,或者只需保持连接打开并继续向数据库写入数据。

首先,这种做法是否可行?其次,如果连接保持打开状态,第三方应用程序或计算机能否同时访问数据库并读取我的程序存储的数据?


还有一件事。我能每秒打开和关闭连接几次吗?或者有超时或其他阻止这种频繁使用的限制吗? - redfrogsbinary
程序将会24/7运行。这意味着永远不会关闭连接。 - redfrogsbinary
2
http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx - Mitch Wheat
1
个人而言,我会打开/关闭以避免范围/生命周期中的混淆传输 - 即使可能不需要。如果存在性能问题,请进行基准测试(正如其他人指出的那样,池化基本上可以抵消这一点)。但是,请务必管理事务。即使保持数据库处于打开状态,也要记得根据需要提交。否则,数据可能永远不会被提交或锁定可能永远不会被释放 :) - user166390
4个回答

11

一个数据库支持多个并发连接,因此在这种情况下保持DB连接是可行的——只有当您使用i.e.导致行/表锁定的长时间运行查询时,才会阻止其他人。完成后,只需关闭连接即可。

另外,请考虑大多数DB(例如SQL Server)在内部使用连接池,因此即使您关闭了DB连接,它也只会返回到池中并不会被物理关闭——池管理物理DB连接——从而提高性能,因此快速打开/关闭连接的影响将减小。

来自MSDN

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


1
实际上我不会这样做。根据需要打开/关闭连接,并让连接池执行其设计的功能。 - Mitch Wheat
池化是自动进行的吗? - redfrogsbinary
2
@redfrogsbinary:除非您显式禁用它,否则默认情况下它是开启的。 - BrokenGlass

3
我会打开连接,循环尽可能多次,然后关闭连接。但是,感谢Mitch Wheat和Dave Markle的帮助,我已经学会了在.NET中后台免费完成连接池,因此这种开销应该分摊到您所有的请求中。
更好的方法是,在循环中批处理请求,并在循环结束后执行批处理。这样只需要一个网络往返。
如果您同意上述最后一点,我会确保批量插入在事务上下文中完成,以便可以作为单个工作单元进行提交或回滚。隔离和线程安全将非常重要。

2
"打开和关闭非常昂贵。" - 第一次打开很费时,之后,只要连接字符串相同,连接池就会启动。但正如您所说,批处理请求也是如此。 - Mitch Wheat
循环永远不会结束。这就是保持COM端口打开的原因。 - redfrogsbinary
2
虽然打开和关闭连接可能是昂贵的,但他正在使用C#,这可能意味着他在后台使用了连接池技术,几乎完全消除了这个问题。 - Dave Markle
1
假设 Mitch 使用了对象池,一开始没有任何迹象表明在使用。如果你看到了,我同意。我之前不知道在 .NET 中使用对象池是免费的。如果是这样的话,我会修改我的答案。 - duffymo
池化是自动进行的吗? - redfrogsbinary

0

0

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


1
在这种情况下,我会谨慎地尽可能短暂地保持连接。 - user885100
在我的情况下,每次都会在循环中。 - redfrogsbinary
只有在还有读写任务时,我才会保持连接处于打开状态。如果你正在等待其他进程/步骤完成,我会关闭连接。 - user885100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接