一、连接池和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 }
三、连接池问题
连接池暂时还没涉及到,觉得是个比较重要的知识点,暂且放一下,今后使用的时候,再深入了解。