请问各位大神,在部署java ee程序的时候出现关于ThreadLocal的错误,帮忙看看是怎么回事吧
发布网友
发布时间:2022-05-04 20:09
我来回答
共1个回答
热心网友
时间:2023-10-08 14:17
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
/**
* 获得数据库连接
*/
public static Connection getConnection(){
if(null == connectionHolder.get()){
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
connectionHolder.set(conn);
}
return connectionHolder.get();
}
/**
* 关闭数据库连接
*/
public static void closeConnection(){
if(connectionHolder.get() != null){
Connection conn = connectionHolder.get();
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
connectionHolder.remove();
}
}
被废弃了的ThreadLocal所绑定对象的引用,会在以下4情况被清理。
如果此时外部没有绑定对象的引用,则该绑定对象就能被回收了:
1 Thread结束时。
2 当Thread的ThreadLocalMap的threshold超过最大值时。
3 向Thread的ThreadLocalMap中存放一个ThreadLocal,hash算法没有命中既有Entry,而需要新建一个Entry时。
4 手工通过ThreadLocal的remove()方法。
因此如果我们粗暴的把ThreadLocal设置null,而不调用remove()方法,那么就可能造成ThreadLocal绑定的对象长期也能被回收,因而产出内存泄露。