簡體   English   中英

如何解決c3p0並發問題?

[英]How to solve c3p0 concurrency issues?

我正在嘗試實現數據庫連接池。 由於某些原因,當我使用多個線程時,我會隨機獲得異常。

當我只有一個時,一切都很好。 同樣至少在測試時,問題僅出現在開始時。 由於我不確定是什么原因導致的,因此我無法確定它們以后是否也會發生。

使用c3p0版本0.9.5.2

Example output from my test: https://pastebin.com/NrcR6mhz

該測試有3個線程,每個線程運行簡單查詢1000次。 我縮短了輸出,因為以后也沒有例外。

tl; dr版本的錯誤消息:

  • 您不能對封閉的聲明進行操作!!!
  • 您不能在封閉的連接上操作!!!

由於DB是單獨配置的,因此我不會上載整個項目。 但是,您可以在這里查看我所有類的代碼:

Main - https://pastebin.com/1Rgjr8H5

Pool conf https://pastebin.com/wtbw1X5v

Controller https://pastebin.com/BvPh0guY

由於c3p0似乎是不錯的庫,我想我在這里做錯了。 有什么建議嗎?

因此,您需要考慮一下多線程編碼的工作原理,為什么人們通常更喜歡只能在局部作用域訪問的對象,而不是實例變量或靜態成員變量,以及何時應該同步以安全訪問必須在線程之間共享的對象。

你最基本的問題是, MariaController.connection是一個靜態成員變量,當它應該是完全本地isPlayerSuspended(...)

您還應該將靜態MariaConnectionPool.getInstance()方法標記為synchronized [等效於使用synchronized( MariaConnectionPool.class ){ ... }將鱈魚的主體包圍起來。

可能還有其他問題。 編寫多線程代碼需要您仔細考慮可以共享的內容以及何時共享,通常的答案是通過在只能通過方法內的本地引用訪問的對象中使用它來共享可變狀態(訪問本質上是單線程的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM