2012-11-22 41 views
0

我有一个使用多线程使用线程池的Java程序。每个线程将做出一些选择和插入语句。数据库是MySQL InnoDB。MySQL中的MySQL和多线程编程

我打算推出几个运行屏幕(6个进程),并且每个进程都将采用多线程。我的问题是:

1)我可以为池定义多少个线程?自从我的处理器是Core i7-2640M以来,我是否限制了最多4个线程?

2)我应该担心任何关于数据库完整性的问题吗?我没有在我的程序中使用同步(thre不需要),但我担心DB插入语句。我是否需要同步它们,否则MySQL会注意知道我在主函数中为每个进程都有一个连接。

请告诉我。

回答

0

关于螺纹量

您可以在单个核心100个线程,如果你喜欢。操作系统将schedule他们每个人都有一些时间来运行。一台正在运行的计算机已经有几百个活动线程/进程,其中大部分只是闲置(Windows任务管理器在某处显示信息)。

CPU中的每个内核可以一次运行1个线程。 i7-2640M有两个物理内核,但每个都是超线程(=在“并行”中在一个物理内核上运行2个线程),因此它提供了4个内核供您使用。

要近似最佳线程数,您需要知道线程的活动情况。如果每个线程一直运行而没有睡眠/等待,它将占用一个完整的内核。在这种情况下,你不应该使用4个以上的线程,因为它们会阻塞对方。在活动线程之间切换需要CPU的时间,因此更多的线程会导致整体性能下降。

如果你的线程正在等待,你需要找出活动的百分比。例如。每个屏幕线程大多数时间都会等待用户输入。每个输入需要1秒的时间进行处理,并且您希望每个屏幕每分钟会获得30个事件。这意味着你需要每分钟大约30秒。您每分钟有4 x 60秒的时间,因此您的最佳线程数/屏幕数将大约为8.

如果您有一个执行程序来运行小任务,每个小任务在几秒钟内完成,那么使用的线程数与核心数相同。小任务可以由执行器分配给线程,这样每个内核就可以回到大约100%的负载。

关于Db的完整性

看到尤金·里克。交易是确保原子修改的方式(=其他进程不能看到交易开始和结束之间的状态)

1

从2开始 只要您注意隔离级别,就可以保证数据库的完整性:如果您的插入不是原子性的,或者您的选择关心从其他线程插入时间,请使用事务。

关于1) 线程的最佳数量高度依赖于这些线程的功能:等待远程数据库事务完成的线程不需要可用的内核。我建议你从核心数量的4倍开始,并从那里开始测试。根据您的操作系统,您还需要对进程与线程进行基准测试。