0

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

我计划启动几个运行屏幕(6 个进程),每个进程都将使用多线程。我的问题是:

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

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

请给我提意见。

4

2 回答 2

1

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

关于 1) 最佳线程数在很大程度上取决于这些线程的作用:等待远程数据库事务完成的线程肯定不需要可用的内核。我建议您从核心数的 4 倍开始,然后从那里开始测试。根据您的操作系统,您还需要对进程与线程进行基准测试。

于 2012-11-22T14:00:51.603 回答
0

关于线量

如果您愿意,您可以在一个内核上拥有 100 个线程。操作系统将安排它们,以便每个都有时间运行。一台正在运行的计算机已经有几百个活动线程/进程,其中大多数只是空闲的(Windows 任务管理器在某处显示该信息)。

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

要近似最佳线程数,您需要知道线程的活跃程度。如果每个线程一直在没有睡眠/等待的情况下运行,它会占用一个完整的核心。在这种情况下,您不应使用超过 4 个线程,因为它们只会相互阻塞。在活动线程之间切换需要一些 CPU 时间,因此更多线程将导致整体性能降低。

如果您的线程正在等待,您需要计算出活跃度的百分比。例如,每个屏幕线程大部分时间都在等待用户输入。每个输入需要 1 秒的时间来处理,您预计每个屏幕每分钟将获得 30 个事件。这意味着您每分钟需要大约 30 秒。您每分钟有 4 x 60 秒,因此您的最佳线程/屏幕数约为 8。

如果您有一个执行程序来运行小任务,每个任务都在几秒钟内完成,那么使用与您拥有的内核一样多的线程。执行程序可以将小任务分配给线程,这样您就可以恢复到每个内核大约 100% 的负载。

关于数据库完整性

见欧根·瑞克。事务是确保原子修改的方法(= 没有其他进程可以看到事务开始和结束之间的状态)

于 2012-11-22T14:38:01.020 回答