簡體   English   中英

跨線程訪問變量和方法

[英]Accessing variables and methods across threads

我正在使用Java創建接口以連接到數據庫。 每次我想調用數據庫時,都需要創建與數據庫的新連接,這會使調用數據庫的速度降低10倍。

為了避免每次我想調用數據庫時都必須創建新的連接,我運行了一個Java線程來保存所有連接信息。

要從數據庫寫入/讀取數據,我想創建一個線程,該線程使用存儲在已經運行的線程中的連接信息,使用它執行指定的讀取/寫入功能,然后退出。

但是我無法從已經運行的線程訪問此信息。 做到這一點的最佳方法是什么?

這是一個糟糕的主意,因為java.sql.Connection不是線程安全的。

更好的主意是使用連接池。 讓每個線程檢出一個連接,使用它,然后放回去。

最好的方法是不要重新發明輪子。 連接池有很好的開放式開放源代碼實現,我建議您使用它們。

如果您已經在容器中運行,請使用DataSource。 研究c3p0( http://sourceforge.net/projects/c3p0/ )和commons-dbcp( http://commons.apache.org/dbcp/

為什么需要運行一個線程來保持連接打開,只將其存儲在某個地方並在需要時立即執行查詢..它應該工作嗎?

無論如何,如果您真的想要一個線程,則應該考慮擁有一個同步的集合(請檢查Collections.asSynchronizedList ),該Collections.asSynchronizedList可以從您的線程和其他線程進行訪問和管理。

要克服可見性問題,只需將其聲明為static final變量,這樣就可以從聲明了該變量的線程外部訪問它時沒有任何問題。

另一個簡單的解決方案(因為連接似乎不是線程安全的)不是使用線程,而是僅使用監視器:您可以輕松地管理一個wait() / notify()機制,要執行查詢的線程將對其進行檢查如果連接是“免費的”。 如果它占用了監視器,則在通知所有等待的線程之前做任何想做的事情。

你為什么做這個? 有一些框架,例如Spring或類似的框架,將為您管理連接。 不要重塑方向盤人。

我建議使用通用對象池而不是構建自己的解決方案,並建議從Apache Commons檢查Commons Pool (這是通用對象池的API,不是DBCP)。

暫無
暫無

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

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