【问题标题】:Sharing database connection with threads, instead of creating new ones与线程共享数据库连接,而不是创建新的
【发布时间】:2011-11-08 18:15:49
【问题描述】:

我想在尝试之前检查一下。我正在处理几个线程,这些线程需要从线程中的数据库中获取数据。目前,根据我所见,我正在从线程中创建一个新的数据库连接(TADOConnection)。一切正常,但如果我可以从线程外部的某个地方获取连接对象会很棒。基本上,我不想继续为每个线程执行创建一个新的 TADOConnection。

是否可以在线程外部发布 TADOConnection 属性(因此在我创建线程时分配它)然后在线程内使用该连接?然后我需要做的就是在线程内创建 TADODataSet 并将其连接分配给这个 TADOConnection。我对此有点怀疑,特别是因为在线程中使用 ADO 时需要调用 CoInitialize 和 CoUninitialize。

【问题讨论】:

  • Is Delphi's TADOConnection thread-safe? 的可能重复项另外,您总是必须在每个使用 COM 的单独线程中调用 CoInitialize/CoUnitialize,因为 COM 是特定于线程上下文的。
  • 好吧,如果线程/s 刚刚创建了一个 TADOConnection 并且在应用程序运行期间一直挂在它上面,这有关系吗?您是否需要不断创建/销毁这些线程?
  • 已经有了我的答案 - 问题是我根据需要创建这些线程,这可能意味着一次 10 个线程,或者每半小时 1 个线程。他们确实释放了自己,他们不会保持活跃,一旦完成,我就不再使用它了。我只是想看看我是否可以避免多次创建它。
  • 池化你的线程并使它们可重入,这样你就可以重用线程而不是在每个任务之后释放它们。
  • 我实际上是在做 2 层线程。我有一个主线程,是的,它正在循环中继续。但是其他的只是按需创建,并且从来没有专门针对一个主题。基本上它向服务器发送单个请求,等待响应,然后在收到响应时触发事件。一旦我得到那个回应,我就不再需要它了。这些请求中的每一个都从其自己的线程发送到服务器。比如我需要 3 个数字,每个数字都需要很长时间来计算,我同时发送 3 个请求,从而产生 3 个线程。

标签: database multithreading delphi delphi-7 adoconnection


【解决方案1】:

答案似乎没有。因为TADOConnection(和其他ADO 组件)是基于COM 的,所以它们不能跨线程传递。所以在这种情况下,我别无选择,只能在每个线程中创建一个新的TADOConnection。继续运行的线程每次循环时都会使用此连接,但单次运行的线程仅使用一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2023-03-03
    • 2014-01-28
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多