处理并发 Java 级别与 database/JPA 级别

Handle Concurrency Java level vs database/JPA level

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

问题:

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

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

1) Java 客户端级别的并发性

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

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

性能问题和并发问题完全是两个不同的问题域。两者最好不要混用。

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

您可以参考以下教程:

  1. JPA Optimistic Locking - Oracle Blog
  2. The Java EE 6 Tutorial

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

Java和数据库并发各有优缺点。

数据库级别:

优点:

1) 更易于实施和维护。

缺点:

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


Java 等级:

优点:

1) 更好的资源利用率

缺点:

1) 调试和测试非常复杂。

2) 可能发生死锁。

3) 难以在 Java 编程中实现。

4) 不良设计所涉及的风险因素。(饥饿)

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

参考:java Concurrency vs JPA concurrency

参考: