2017-09-13 105 views
0

我正在创建一个futures_cpupool::CpuPool,其中每个线程都需要打开数据库连接,这是一个昂贵的初始化。这些初始化的状态需要在作业之间保持持续,因为它们需要很长时间才能建立。数据库连接对于工作线程来完成他们的工作是必需的。如何保存“CpuPool”工作线程的状态?

+0

注意:''CpuPool'专门用于激烈的CPU工作,最主要的原因是它阻塞整个线程,因此,不建议在上述工作期间使用网络连接。 –

+0

我不明白为什么它会阻止整个线程@MatthieuM。 – njaard

+0

如果您有长期存在的事务,这是一个可伸缩性问题:您需要更多的线程。 CpuPool是为CPU限制任务设计的,将它用于其他任何可能都不太理想......尽管它当然对你来说可能已经足够了。 –

回答

0

免责声明:有可能是一个更好的解决方案充分利用一些CpuPool API,也许...

简单的解决办法是使用一个单独的ConnectionPool,与Arc共享。

然后,你只需当你启动一个线程,并要求他们获得从那里连接交给ConnectionPool参考。

池本身将负责:

  • 准备新的连接(执行初始化工作),
  • 回收用过的连接,以便提出进一步的要求得到满足更快。

如果连接参数发生变化(例如,指定不同的区域设置),这里有一点困难。我建议每个客户都被交给一个“新鲜”的连接,所有的设置都被标准化为一个已知的值。

还有什么时候(和在哪个线程上)执行初始化和回收工作的设计选择;我建议你从最简单的解决方案:

  • 初始化点播,
  • 回收时立即移交。
+0

ConnectionPool在哪个箱子里?这也不是一个理想的解决方案,因为不能保证一个线程总是获得相同的连接。这是更好的行为,因为不需要“发送”并具有稍好的NUMA行为。 – njaard

+1

@njaard:这不是箱子,你必须自己写。如果您认为它很重要,欢迎您推荐线程亲和力,但老实说,在数据库连接中,网络部分与CPU /内存相比非常缓慢,我甚至不会打扰。 –