【问题标题】:2 Threads vs 2 Processes (design/performance/isolation)2 线程 vs 2 进程(设计/性能/隔离)
【发布时间】:2015-03-09 09:00:48
【问题描述】:

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

2 个线程将能够共享相同的内存,并且它们无需写入该共享内存:即使它们执行不同的工作,它们也只会从内存中读取而不更改它。

所以我的问题是:

  1. 如果两个不同的程序同时运行,我可能会遇到问题吗? (我知道我可以同步我的线程)

  2. 哪个性能更好?哪个会更快?

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

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

我正在使用 Java 和 MySQL。

【问题讨论】:

    标签: java mysql database multithreading design-patterns


    【解决方案1】:

    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 驱动程序实现不是线程安全的,则会出现错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 虽然没有功能上的差异,但在性能方面,如果您采用 2 进程方法,您将支付两次启动和管理 JVM 的开销。
      • 虽然一般情况下可能是这种情况,但这并不是绝对必要的,因为取决于应用服务器架构。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 2010-12-31
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多