Multithreading 处理Java级别与数据库/JPA级别的并发性

Multithreading 处理Java级别与数据库/JPA级别的并发性,multithreading,jpa-2.0,java.util.concurrent,optimistic-locking,optimistic-concurrency,Multithreading,Jpa 2.0,Java.util.concurrent,Optimistic Locking,Optimistic Concurrency,场景:在任何类型的在线预订应用程序中,人们都有可能同时访问该应用程序。 因此,该特定应用程序中可能存在并发问题 问题: 在这种情况下,如果一个或多个用户同时访问应用程序,则存在并发问题 为了解决并发问题,我们有两种解决方案 1) 客户端级别的Java并发 2) 持久性级别的JPA乐观锁定或悲观锁定 如果数据库包含1000万条或更多记录,那么哪一条是最佳解决方案?性能问题和并发性问题是两个不同的问题域。最好不要两者兼而有之 关于并发问题: Java并发或多线程在在线预订系统中的使用可能非常有限。为

场景:在任何类型的在线预订应用程序中,人们都有可能同时访问该应用程序。 因此,该特定应用程序中可能存在并发问题

问题

在这种情况下,如果一个或多个用户同时访问应用程序,则存在并发问题

为了解决并发问题,我们有两种解决方案

1) 客户端级别的Java并发

2) 持久性级别的JPA乐观锁定或悲观锁定


如果数据库包含1000万条或更多记录,那么哪一条是最佳解决方案?

性能问题和并发性问题是两个不同的问题域。最好不要两者兼而有之

关于并发问题: Java并发或多线程在在线预订系统中的使用可能非常有限。为了避免问题,您必须使用JPA乐观锁定(最好)或悲观锁定。这是因为如果应用程序的多个实例并行运行(或多个线程),那么使用JVM级别的线程安全技术就不可能避免更新丢失

您可以参考以下教程:


  • 这完全取决于应用程序。如果数据模型不复杂也不庞大,那么JPA乐观锁定是最佳解决方案

    Java和数据库并发都有各自的优点和缺点

    数据库级别:

    优势:

    1) 它易于实施,也便于维护

    缺点:

    1) 如果数据库包含大量复杂的数据,则可能导致死锁和超时


    Java级别:

    优势:

    1) 更好地利用资源

    缺点:

    1) 调试和测试非常复杂

    2) 有可能发生死锁

    3) 很难在Java编程中实现

    4) 与糟糕的设计有关的风险因素。(饥饿)

    5) 它不能从一个环境移植到另一个环境

    参考:


    ref:

    哪种解决方案是最佳的?JPA乐观锁定(最好)是最佳的实现,还是我们从数据库中获得死锁如果我们使用Java并发,我们从数据库中不会获得死锁超时在乐观锁定中,我们必须自己重试失败的事务(OptimisticLockException),死锁不应该发生。Java并发不是数据库级冲突的解决方案,因此这超出了本讨论的范围。如果数据库中有1000万条或更多记录,那么也是一个最佳解决方案?它将取决于线程争用(写入单个共享变量的线程数),而不是总记录数。若线程争用很高,则无论数据库表中记录的数量如何,性能都会降低。