我通过com端口连续接收数据并进行解码。当解码完成后,我需要将结果存储到SQL数据库中。我在考虑,由于解码是在while循环中持续进行的,每秒钟会进行数十次解码,并且数据需要每秒钟写入数据库数十次,如果在每个while循环中打开和关闭与SQL服务器的连接是否明智,或者只需保持连接打开并继续向数据库写入数据。
首先,这种做法是否可行?其次,如果连接保持打开状态,第三方应用程序或计算机能否同时访问数据库并读取我的程序存储的数据?
我通过com端口连续接收数据并进行解码。当解码完成后,我需要将结果存储到SQL数据库中。我在考虑,由于解码是在while循环中持续进行的,每秒钟会进行数十次解码,并且数据需要每秒钟写入数据库数十次,如果在每个while循环中打开和关闭与SQL服务器的连接是否明智,或者只需保持连接打开并继续向数据库写入数据。
首先,这种做法是否可行?其次,如果连接保持打开状态,第三方应用程序或计算机能否同时访问数据库并读取我的程序存储的数据?
一个数据库支持多个并发连接,因此在这种情况下保持DB连接是可行的——只有当您使用i.e.导致行/表锁定的长时间运行查询时,才会阻止其他人。完成后,只需关闭连接即可。
另外,请考虑大多数DB(例如SQL Server)在内部使用连接池,因此即使您关闭了DB连接,它也只会返回到池中并不会被物理关闭——池管理物理DB连接——从而提高性能,因此快速打开/关闭连接的影响将减小。
来自MSDN:
连接池减少了必须打开新连接的次数。池管理器拥有物理连接的所有权。通过保持每个给定连接配置的一组活动连接,它管理连接。每当用户在连接上调用Open时,池管理器会在池中查找可用连接。如果有可用的池连接,则将其返回给调用者,而不是打开新连接。当应用程序在连接上调用Close时,池管理器将其返回到活动连接的池集合中,而不是关闭它。一旦连接返回到池中,它就可以在下一个Open调用上重用。
实际上,您必须显式地关闭SqlConnection.Open()。
根据MSDN的说明,“注意 如果SqlConnection超出范围,则不会关闭。因此,您必须通过调用Close或Dispose来显式关闭连接。”
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.71).aspx
干杯!
我个人会每次打开和关闭连接。您应该以一种方式保护代码,使得任何异常最终都会关闭您的连接。您的应用程序是否是唯一与此数据库交互的应用程序?