案例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