我对这个话题进行了广泛的研究,并与我的同事进行了深入的讨论。
普遍的共识似乎是,数据库连接应该在需要时打开并立即关闭。连接的任何缓存/池都应该由数据库驱动程序或其他层完成,而不是由应用程序本身完成。
但是我对Jet / ADO有疑虑。 Jet和/或ADO使用读取缓存和惰性写入,这可能导致"unsynchronized" connections。当然,我每次使用JRO时都可以重新同步连接,但这看起来很麻烦,可能会耗尽性能。
我应该采用关闭每个连接并重新同步每个新连接的“最佳实践”,还是因为Jet / ADO怪癖而应该使用全局连接对象?
答案 0 :(得分:5)
Jet / ACE的一个问题是锁定文件(* .ldb)的创建会对性能造成严重影响。此外,如果LDB已经存在(因为连接了另一个用户),设置锁定可能需要很长时间。
因此,您希望最小化应用程序连接的次数,因为您可能会浪费时间不断重新创建并重新连接到LDB文件。
在Access应用程序中,许多程序员常见maintain a persistent connection。
通常的建议是以隐藏的形式打开表格或打开表格上的记录集。我更喜欢初始化指向后端的数据库变量。托尼在引用文章中的反对意见对我来说似乎微不足道 - 解析连接字符串并不难,例如Mid(CurrentDB.TableDefs(“MyLinkedTable”)。Connect,11)。
在非Access上下文中,您遇到同样的问题,因为这是Jet / ACE数据库引擎问题。当然,维护开放连接的特定方法会有所不同,但重点是保持开放状态意味着数据库引擎对锁定文件的争用较少。
答案 1 :(得分:2)
我认为最好为VB6桌面应用程序使用一个全局连接。理想情况下,数据库驱动程序将透明地管理连接池,但是当您在VB6中使用Jet with ADO或DAO时,不:OLE DB Jet Provider doesn't have connection pooling。我相信.NET提供商会这样做。
我认为您的应用程序是桌面应用程序 - 您实际上没有指定。我没有IIS应用程序或COM +的经验,所以我不知道那里有什么最好的。可能不使用Jet Access!这对桌面应用程序来说很好。
答案 2 :(得分:2)
我工作的最后两个大型VB6 + ADO + Access数据库引擎应用程序(两个不同的团队/雇主)使用相同的方法:
ADODB.Connection
打开ADODB.Recordset
使用Set
rs.ActiveConnection = Nothing
答案 3 :(得分:1)
大多数现代DBMS都提供ConnectionPool来管理连接。但是当你使用时 connection.close()时; 你没有真正关闭连接它只是将它返回到池中,当你写 connection.open(); 实际上,它不会创建新的连接,只需在ConnectionPool中进行准备连接并使用它。
因此,每次要将查询传递给DBMS时打开连接并关闭它是最好的方法,我不会导致性能问题,除了 您不能使用与多个数据读取器SQLDataReader相同的连接。
为此不使用全局连接,尤其是在开发网站时 因为当您的网站上有大量流量时,当两个用户解析您的网页导致2个数据读取器尝试使用相同的连接时,它会随机抛出异常。