案例 1,您的 servlet 使用了一些访问数据库的代码。数据库具有您应该利用的锁定机制。造成这种情况的两个重要原因:数据库本身可能被其他读取和写入该数据的应用程序使用,这不足以让您的应用程序处理与自身的竞争。并且:您自己的应用程序可能会部署到一个扩展的、集群的 Web 容器中,您的代码的多个副本在不同的机器上执行。
因此,有许多标准模式用于处理数据库中的锁,您可能需要阅读悲观和乐观锁。
servlet API 和 JBC 连接池为您提供了一些有用的保证,因此您可以在不使用 Java 同步的情况下编写 servlet 代码,前提是您的变量在方法范围内,在概念上您有
Start transaction (perhaps implicit, perhaps on entry to an ejb)
Get connection to DB ( Gets you a connection from pool, associated with your tran)
read/write/update code
Close connection (actually keeps it for your thread until your transaction commits)
Commit (again maybe implictly)
所以你唯一真正的问题是处理数据库中的任何争用。如今,使用诸如 JPA 之类的东西,上述所有内容往往会做得更好,但在幕后或多或少是正在发生的事情。
案例2:静态方法,这大概意味着您现在将所有内容都保存在内存结构中。这(除非某种远程调用)暗示一个单一的 JVM 并且您管理自己的锁定。如果您的 JVM 或机器崩溃,我猜您会丢失数据。如果您关心您的数据,那么使用数据库可能会更好。
或者,完全不同的方法怎么样:servlet 通过将消息写入持久 JMS 队列来简单地记录“投票”。让其他一些进程从队列中获取选票并将它们添加起来。您不会以这种方式立即向选民提供反馈,但您将用户体验与实际(在类似场景中)相当复杂的处理脱钩。