案例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队列来简单记录“投票”。让其他进程从队列中提取投票并添加它们。您不会以这种方式立即向选民提供反馈,但是您可以将用户的体验与实际(在类似场景中)的相当复杂的处理分离开来。
谢谢迈克。是的,我使用JDBC,我会读到有关ThreadLocal的内容,再次感谢。 – Abdullah 2010-05-04 20:37:43
Servlet API和其他JEE API简化了这些。您的servlet方法中的本地变量实际上是线程本地的(在服务请求期间)。应用程序服务器中的JDBC连接池将为每个线程提供自己的连接。大多数困难发生在不同的线程竞争,在这种情况下可能在数据库本身。情绪表示,这是真正的设计工作开始的地方。 – djna 2010-05-04 20:54:33