使线程使用中央数据库连接的正确方法

Jer*_*dge 2 delphi service multithreading

我正在Delphi XE2中构建一个多线程服务应用程序.除了其他线程之外,每个线程都有自己的用途.主服务线程仅负责保持其他线程的运行并保存日志文件等.这些线程中的每一个都通过同步事件触发器报告回主服务线程.这些线程在服务启动时创建,在服务结束时销毁.

我想引入一个单独的线程作为集中式数据库连接,以避免创建许多实例TADOConnection.我的服务代码可以调用标准函数,UserListDataSet := DBThread.GetUserList(SomeUserListDataSet);如果我可以发送直接的SQL语句,那也很好SomeDataSet := DBThread.Get(MySqlText);.我也想避免太多CoInitialize()等等.

作业线程将需要使用此db线程.我需要弄清楚如何"询问"某些数据,"等待"响应,并在请求它的线程中"获取"该响应.我确信有很多方法,但我需要知道哪一个最适合我的场景.Windows消息?活动?我应该有某种排队吗?它应该发送数据集还是别的什么?有没有可以做到这一点的东西?我需要弄清楚如何以可以从其他线程重用的方式构造这个DB线程.

结构如下所示:

+ SvcThread
  + DBThread
    + TADOConnection
  + Thread1
  + Thread2
  + Thread3
Run Code Online (Sandbox Code Playgroud)

我需要线程1 2和3来向DBThread发送请求.当一个线程向它发送任何请求时,它需要等到它得到响应.一旦有响应,数据库线程需要通知请求线程.每个线程也可以同时向此DB线程发送请求.

关于如何实现这一目标的一个很好的教程将是完美的 - 它只需要适合我的场景.我不需要只知道"如何让两个线程一起讨论",而是"如何使许多线程与集中式数据库线程通信".这些作业线程是作为主服务线程的子项创建的,并不归db线程所有.db线程不知道作业线程.

TMN*_*TMN 6

通常,您有一个请求队列,其中存储了所有请求.数据库线程从队列中读取请求,处理它,然后调用请求者指定的回调例程来处理结果.不确定这如何映射到Delphi范例,但基础应该是相同的.

  • 我把它放在主服务线程中,所以如果你的数据库线程因错误而死,你仍然有队列进行事后分析. (2认同)