ThreadLocal管理Connection
ThreadLocal管理Connection
每一個用戶都對應有一個單獨線程,每一個線程都有一個數據庫連接對象Connection對象接待它.
一個用戶對應一個線程,這個線程中的Connection對象或者數據庫連接對象是唯一的,且只能有一個.
怎么去獲得這個數據庫連接對象?(看下面的代碼)
?
ThreadLocal還可以管理Hibernate中的session對象,還可以管理Struts2中的dispatherFileter和Spring中的東西.
?
每個線程都有一個獨立的副本,這樣會存在一個小問題.
如果線程特別多,對象特別大的話.這個時候會造成內存占用的比較大,內存泄露的問題.(這是一個非常嚴重的問題)
ThreadLocal 用于每一個線程都有一個對象的副本。“以空間換時間”
?
給了解決方案:
源碼中繼承了一個WeakReference類,弱引用.通過這個類解決了可能造成的內存泄露的問題.
一般的類,如果不繼承WeakReference這個類,都是強引用的.
強引用比如說: String str = "xxx";? str被xxx引用著,如果引用不消失.
即使這個引用沒有工作了,他們就一直會占用著內存.垃圾回收無法把他們回收掉.
如果是弱引用的,即使它飲用著,如果它不工作了...垃圾回收照樣會把它們回收.
這就是ThreadLocal的解決內存泄露的問題.
但是仍然建議你使用ThreadLocal類中的remove()方法手動的移除掉.
?
2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 8 /* 9 * 通過ThreadLocal來管理Connection對象. 10 * ThreadLocal還可以管理Hibernate中的session對象,還可以管理Struts2中的dispatherFileter和Spring中的東西. 11 * ThreadLocal 用于每一個線程都有一個對象的副本。“以空間換時間” 12 * 內存泄漏?-->弱引用:WeakReference 13 * String str = "xxx"; 14 * 15 */ 16 17 public class ConnectionManager { 18 private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); 19 20 private ConnectionManager(){} 21 22 public static Connection getInstance(){ 23 try { 24 Connection conn = threadLocal.get(); 25 if(conn == null){ 26 conn = DriverManager.getConnection("");//獲取數據庫連接對象 27 threadLocal.set(conn); 28 } 29 return conn; 30 } catch (SQLException e) { 31 e.printStackTrace(); 32 } 33 return null; 34 } 35 36 }?
總結
以上是生活随笔為你收集整理的ThreadLocal管理Connection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专家支招:如何利用Plesk搭建完美全能
- 下一篇: JavaScript 的开源功能插件和框