【发布时间】:2025-12-22 07:35:06
【问题描述】:
我想知道哪种方法更好,在一系列 o 线程之间共享一个 odbc 连接,使用互斥锁来确保没有并发问题,或者每个线程都有一个而不使用互斥锁。我没有看到任何实质性优势,但也许 odbc 实现中我缺少一些东西。
我试图寻找类似的问题,但找不到任何东西,如果之前已经回答过,对不起
【问题讨论】:
我想知道哪种方法更好,在一系列 o 线程之间共享一个 odbc 连接,使用互斥锁来确保没有并发问题,或者每个线程都有一个而不使用互斥锁。我没有看到任何实质性优势,但也许 odbc 实现中我缺少一些东西。
我试图寻找类似的问题,但找不到任何东西,如果之前已经回答过,对不起
【问题讨论】:
ODBC 驱动程序管理器已提供连接池:https://msdn.microsoft.com/en-us/library/ms716319(v=vs.85).aspx
连接池使应用程序可以使用来自 每次使用都不需要重新建立的连接池。
简而言之:如果您的应用程序释放了连接,并且启用了连接池,驱动程序管理器可能不会立即关闭连接,而是将其保持打开一段时间。如果您的应用程序请求打开一个新连接,驱动程序管理器可能会从其池中返回这样一个已经打开的连接。
所以:我不关心在你的线程中做所有的锁定,而只是启用连接池并让每个驱动程序使用它自己的连接。
请注意,您可以在进程级别或为每个环境句柄启用连接池 - 请参阅文档中的备注:
通过调用 SQLSetEnvAttr 来设置连接池 SQL_ATTR_CONNECTION_POOLING 环境属性到 SQL_CP_ONE_PER_DRIVER 或 SQL_CP_ONE_PER_HENV。
【讨论】:
我认为这取决于您希望通过实施实现什么。与许多线程只有一个共享连接将导致线程被阻塞并等待连接可用。这会降低性能。如果你有大量线程,我宁愿创建一种连接池来处理连接的创建、使用和关闭。
【讨论】: