ThreadLocal理解和使用

一、连接池和ThreadLocal

找了不少关于连接池和ThreadLocal的知识,最简单直白并且能够以我能力理解的:用连接池是为了缓存已经打开的连接,提高性能,解决资源频繁分配问题;用ThreadLocal是为了多个数据库操作是用的同一个连接,是为了事务。

ThreadLocal的几种方法:

  • void set(Object value)设置当前线程的线程局部变量的值。
  • public Object get()该方法返回当前线程所对应的线程局部变量。
  • public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可 以加快内存回收的速度。
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调 用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

一般步骤:从连接池中获取connection,在set到ThreadLocal中,再从ThreadLocal中get。

二、ThreadLocal使用

 1 //数据库连接URL
 2     private static final ThreadLocal<Connection> ConnectionHolder=new ThreadLocal<Connection>();
 3     private static String mysqlurl = "jdbc:mysql://localhost:3306/test?"
 4             + "user=root&password=root&useUnicode=true&characterEncoding=UTF8";
 5     //数据库连接
 6     public static void setConnection() throws Exception{
 7         Connection conn=null;
 8         conn=DriverManager.getConnection(mysqlurl);
 9         ConnectionHolder.set(conn);
10     }
11     
12     //获取数据库连接
13     public static Connection getConnection() throws Exception{
14         setConnection();
15         return ConnectionHolder.get();
16     }
17     //连接释放
18     public static void removeConnection(Connection conn){
19         if(conn!=null){
20             try {
21                 conn.close();
22             } catch (SQLException e) {
23                 // TODO Auto-generated catch block
24                 e.printStackTrace();
25             }
26             conn=null;
27         }
28     }

三、连接池问题

连接池暂时还没涉及到,觉得是个比较重要的知识点,暂且放一下,今后使用的时候,再深入了解。

原文地址:https://www.cnblogs.com/Nouno/p/5737301.html