2个线程与2个进程(设计/性能/隔离)

时间:2015-03-09 09:00:48

标签: java mysql database multithreading design-patterns

我需要决定是使用2个线程还是2个进程(在任何一种情况下,都会连接到同一个数据库)。

2个线程可以共享相同的内存,并且它们不需要写入该共享内存:即使它们正在执行不同的工作,它们也只会从内存中读取而不会更改它

所以我的问题是:

  1. 如果两个不同的程序同时运行,那么我可能会在数据库中插入或提取值时遇到问题吗? (我知道我可以同步我的线程)

  2. 哪个会有更好的表现?哪个会更快?

  3. 使用2个线程,调试程序比使用2个进程更难。哪种设计对我来说更正确,更容易?

  4. 如果我使用2个进程,我需要连接两次数据库;而线程可以共享相同的内存。

    我正在使用Java和MySQL。

4 个答案:

答案 0 :(得分:2)

1)Mysql使用锁系统。根据您的引擎,锁定将在整个表(MyISAM)上或仅在一行(InnoDB)上。基本上2个程序可以毫无问题地访问同一个数据库。 source

  

MySQL使用InnoDB表的行级锁定来支持多个会话的同时写访问,使其适用于多用户,高度并发和OLTP应用程序。 MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,一次只允许一个会话更新这些表,使它们更适合于只读,大多数读取或单用户应用程序。

2)两个线程和两个进程之间的性能差异取决于您的实现通常您使用两个线程,因为您希望同时执行多个任务,但每个任务将取决于其他任务。例如,如果要为0到100之间的每个值计算某些值,则可以创建两个线程。第一个将计算0 ... 50的所有值,第二个计算51 ... 100的值。在这种情况下,线程具有更好的性能 相反,当每个进程独立且不需要另一个进程正常工作时,您使用两个进程。例如,您可以使用一个过程来计算0到100之间的n的某些数据,以及另一个显示结果的数据。计算过程不会重新获取显示过程。显示过程将锁定计算结果的存储位置并显示它们。在这种情况下使用线程不会提高性能并且速度会慢一些
如果你想要一个更接近现实的例子,如果你和一个超市的朋友一起去购物,你可以将你的清单分成两部分,当你的朋友照顾另一部分时,你可以把你的产品拿走。最后,您将再次见面以支付整个列表。这类似于多线程
相反,如果你想租一部电影(旧时代)和你的朋友正在做饭,你就不需要彼此来完成你的任务了。这是多个过程。

3)如果你想使用多个线程同时工作,我建议有一个主线程给其他线程命令。在杂货店的例子中,你有一个线程来分割列表和两个线程来获取列表中的内容。最后,“主线程”将采取一切并付费。

4)如果你只想因为开放的SQL连接而使用线程,那就不值得了,我强烈建议每个线程有1个连接。
此外,汇集了连接。当你打开一个新连接时,它并没有真正打开一个新连接,它使用一个当前未使用的连接。
因此,打开一个连接以便在两个线程之间使用它是不值得的,甚至可能导致如果JDBC的驱动程序实现不是线程安全的,那就是错误的bug。

答案 1 :(得分:1)

如果这两个计算单元之间没有任何交互并且没有任何共享数据(除了您的数据库),那么从技术上讲,这作为线程或进程的实现之间没有显着差异。您可以在感觉舒适的情况下实现这些,如果您使用的是某个应用程序服务器,我会将解决方案分离到两个项目,可能会将公共代码库作为单独的子项目派生。但这取决于您的应用程序的性质 - 是否在逻辑上适合将其统一或拆分为单独的应用程序。

答案 2 :(得分:0)

您需要的是"交易隔离级别" 这可以帮助你http://dev.mysql.com/doc/refman/5.6/en/dynindex-isolevel.html

答案 3 :(得分:0)

无论您是使用Java的线程还是进程,每个都应该有自己的MySQL连接。使用InnoDB和事务,让MySQL服务器在两个连接之间保持平衡。