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 * 内存泄漏?-->弱引用:WeakReference13 * String str = "xxx";14 * 15 */16 17 public class ConnectionManager {18 private static ThreadLocalthreadLocal = new ThreadLocal ();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 }