有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 2线程vs 2进程(设计/性能/隔离)

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

两个线程将能够共享相同的内存,并且它们不需要写入共享内存:即使它们正在执行不同的任务,它们也只会从内存中读取,而不会更改内存

因此,我的问题是:

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

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

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

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

我正在使用Java和MySQL


共 (4) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    如果这两个计算单元彼此之间没有交互,也没有任何共享数据(数据库除外),那么从技术上讲,作为线程或进程实现这两个单元之间没有显著差异。你可以随心所欲地实现这些,如果你使用的是应用服务器,我会把解决方案分成两个项目,也许可以把公共代码库作为单独的子项目。但这取决于你的应用程序的性质——在逻辑上,保持它的统一还是将其拆分为单独的应用程序是合适的

  3. # 4 楼答案

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

    MySQL uses row-level locking for InnoDB tables to support simultaneous write access by multiple sessions, making them suitable for multi-user, highly concurrent, and OLTP applications. MySQL uses table-level locking for MyISAM, MEMORY, and MERGE tables, allowing only one session to update those tables at a time, making them more suitable for read-only, read-mostly, or single-user applications.

    2)两个线程和两个进程之间的性能差异取决于您的实现通常您使用两个线程,因为您希望同时执行多个任务,但每个任务将取决于其他任务。例如,如果你想为0到100之间的每个值计算一些东西,你可以创建两个线程。第一个将计算0的所有值。。。第二个是51。。。100.在这种情况下,线程的性能更好
    相反,如果每个进程都是独立的,不需要另一个进程正常工作,则使用两个进程。例如,您可以有一个进程来计算0到100之间的n的一些数据,以及另一个显示结果的进程。计算过程不要求显示过程工作。显示过程将锁定计算结果的存储位置并显示它们。在这种情况下使用线程并不能提高性能,而且可能会更慢

    如果你想要一个更接近现实的例子,如果你和一个朋友去超市购物,你可以把你的购物清单一分为二,当你的朋友在照顾清单的另一部分时,你可以把清单上的产品拿出来。最后,你会再次会面,为整个名单买单。这类似于多线程

    相反,如果你想去租一部电影(旧时代的),而你的朋友在做饭,你不需要彼此来完成你的任务。这是一个多过程

    3)如果您想使用多个线程同时工作,我建议使用一个主线程来命令其他线程。在杂货店的例子中,你有一个线程来拆分列表,两个线程来获取列表上的内容。最后,“主线程”将拿走所有东西并支付费用

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