数据库连接池和连接对象与线程的绑定

 

package com.tarena.dang.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DbUtil {
	//原始JDBC模式的缺点
		//每次都是创建新的Connection,用完了频繁的创建和销毁,消耗资源较大。
		//数据库连接数量很高会导致安全性问题。
	//数据源连接池对象
	private static DataSource dataSource = null;
	//将一个对象和线程绑定
	private static ThreadLocal<Connection> connLocal = 
						new ThreadLocal<Connection>();
	
	static{
		try{
		Properties props = new Properties();
		//加载db.properties配置参数
		props.load(DbUtil.class.getClassLoader()
				.getResourceAsStream("db.properties"));
		//利用dbcp组件创建dataSource对象
		dataSource = BasicDataSourceFactory
					.createDataSource(props);
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	public static Connection getConnection() throws SQLException{
		//获取和当前线程相关的connection
		Connection conn = connLocal.get();
		if(conn == null || conn.isClosed()){//如果没有,或已关闭
			conn = dataSource.getConnection();//获取新的connection
			connLocal.set(conn);
		}
		return conn;
	}
	
	public static void closeConnection(){
		//获取和当前线程相关的connection
		Connection conn = connLocal.get();
		//清除和线程绑定的conn
		connLocal.set(null);//为下一次调用getConnection要新建
		try {
			if(conn != null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

//db.properties文件内容

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
username=root
password=root
#最大连接数量
 maxActive=18
  #初始连接数量
  initialSize=2
 #最大等待时间
maxWait=30000

你可能感兴趣的:(连接池,线程绑定)