连接池原理

Configuration.java

/*
 * 配置信息
 */
public class Configuration {
	private String 	mysqlDriver;
	private String	mysqlURL;
	private String	mysqlUser;
	private String	mysqlPwd;
	private Integer poolMaxSize;
	private Integer	poolMinSize;
	public Configuration() {
		
	}
	public Configuration(String mysqlDriver, String mysqlURL, String mysqlUser, String mysqlPwd, Integer poolMaxSize,
			Integer poolMinSize) {
		super();
		this.mysqlDriver = mysqlDriver;
		this.mysqlURL = mysqlURL;
		this.mysqlUser = mysqlUser;
		this.mysqlPwd = mysqlPwd;
		this.poolMaxSize = poolMaxSize;
		this.poolMinSize = poolMinSize;
	}
	public String getMysqlDriver() {
		return mysqlDriver;
	}
	public void setMysqlDriver(String mysqlDriver) {
		this.mysqlDriver = mysqlDriver;
	}
	public String getMysqlURL() {
		return mysqlURL;
	}
	public void setMysqlURL(String mysqlURL) {
		this.mysqlURL = mysqlURL;
	}
	public String getMysqlUser() {
		return mysqlUser;
	}
	public void setMysqlUser(String mysqlUser) {
		this.mysqlUser = mysqlUser;
	}
	public String getMysqlPwd() {
		return mysqlPwd;
	}
	public void setMysqlPwd(String mysqlPwd) {
		this.mysqlPwd = mysqlPwd;
	}
	public Integer getPoolMaxSize() {
		return poolMaxSize;
	}
	public void setPoolMaxSize(Integer poolMaxSize) {
		this.poolMaxSize = poolMaxSize;
	}
	public Integer getPoolMinSize() {
		return poolMinSize;
	}
	public void setPoolMinSize(Integer poolMinSize) {
		this.poolMinSize = poolMinSize;
	}
	@Override
	public String toString() {
		return "Configuration [mysqlDriver=" + mysqlDriver + ", mysqlURL=" + mysqlURL + ", mysqlUser=" + mysqlUser
				+ ", mysqlPwd=" + mysqlPwd + ", poolMaxSize=" + poolMaxSize + ", poolMinSize=" + poolMinSize + "]";
	}
}

jdbc.properties

mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc:mysql://localhost:3306/test
mysqlUser=root
mysqlPwd=123456
poolMaxSize=100
poolMinSize=10
oracleDriver=oracle.jdbc.driver.OracleDriver
oracleURL=jdbc:oracle:thin:@localhost:1521:orcl
oracleUser=scott
oraclePwd=tiger

 DBManager.java

/**
 * 数据库管理类
 * @author sihai.hou
 *
 */
public class DBManager {
	/**
	 * 配置文件信息
	 */
	private static Configuration conf;
	/**
	 * 数据连接池对象
	 */
	private static DBConnPool pool;
	static {  
		Properties pros = new Properties();
		try {
			pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties"));
			conf = new Configuration();
			conf.setMysqlDriver(pros.getProperty("mysqlDriver"));
			conf.setMysqlPwd(pros.getProperty("mysqlPwd"));
			conf.setMysqlURL(pros.getProperty("mysqlURL"));
			conf.setMysqlUser(pros.getProperty("mysqlUser"));
			conf.setPoolMaxSize(Integer.parseInt(pros.getProperty("poolMaxSize")));
			conf.setPoolMinSize(Integer.parseInt(pros.getProperty("poolMinSize")));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取Configuration
	 * @return
	 */
	public static Configuration getConf(){
		return conf;
	}
	/**
	 * 获取connection对象
	 * @return
	 */
	public static Connection getConn(){
		if(pool==null){
			pool = new DBConnPool();
		}
		return pool.getConnection();
	}
	
	/**
	 * 创建connection对象
	 * @return
	 */
	public static Connection createConn(){
		try {
			Class.forName(conf.getMysqlDriver());
			return DriverManager.getConnection(conf.getMysqlURL(),
					conf.getMysqlUser(),conf.getMysqlPwd());     
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 关闭
	 * @param rs
	 * @param ps
	 * @param conn
	 */
	public static void close(ResultSet rs,Statement ps,Connection conn){
		try {
			if(rs!=null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(ps!=null){
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		//不使用连接池关闭conn
		/*try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}	*/
        //使用连接池关闭conn		
		pool.close(conn);
			
	}
	
	/**
	 * 关闭
	 * @param ps
	 * @param conn
	 */
	public static void close(Statement ps,Connection conn){
		try {
			if(ps!=null){
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		//不使用连接池关闭conn
//		try {
//		if(conn!=null){
//			conn.close();
//		}
//	} catch (SQLException e) {
//		e.printStackTrace();
//	}		
        //使用连接池关闭conn		
		pool.close(conn);

	}
	public static void close(Connection conn){
		//不使用连接池关闭conn
//		try {
//		if(conn!=null){
//			conn.close();
//		}
//	} catch (SQLException e) {
//		e.printStackTrace();
//	}		
        //使用连接池关闭conn		
		pool.close(conn);

	}
}

DBConnPool.java:

/**
 *	 数据库连接池
 * @author sihai.hou
 *
 */
public class DBConnPool {
	/**
	 * 存放数据库连接池集合
	 */
	private  List<Connection> pool;  
	
	/**
	 * 数据库连接池最大数
	 */
	private static final int POOL_MAX_SIZE = DBManager.getConf().getPoolMaxSize(); 
	/**
	 * 数据库连接池最小数
	 */
	private static final int POOL_MIN_SIZE = DBManager.getConf().getPoolMinSize();  
	
	public DBConnPool() {
		initPool();
	}
	/**
	 * 初始化 数据库连接池
	 */
	public void initPool() {
		if(pool==null){
			pool = new ArrayList<Connection>();
		}
		
		while(pool.size()<DBConnPool.POOL_MIN_SIZE){
			pool.add(DBManager.createConn());
			System.out.println("书数据库连接池初始化成功!当前连接池数="+pool.size());
		}
	}
	
	
	/**
	 * 获取连接 ————最后一个
	 * @return
	 */
	public synchronized Connection getConnection() {
		int last_index = pool.size()-1;
		Connection conn = pool.get(last_index);
		pool.remove(last_index);
		return conn;
	}
	/**
	 * 关闭连接:将连接放回连接池
	 * @param conn
	 */
	public synchronized void close(Connection conn){
		if(pool.size()>=POOL_MAX_SIZE){
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}else {
			pool.add(conn);
		}
	}
}

简单测试类:

public class Test{
	public static void main(String[] args) throws SQLException {
		long start = System.currentTimeMillis();
		for(int i=0;i<10000;i++) {
			test();
		}
		long end = System.currentTimeMillis();
		System.err.println(end-start);
		
	}
	/**
	 * 查询10000次 使用连接池耗时:4374
	 * @throws SQLException
	 */
	public static void test() throws SQLException {
		Connection conn = DBManager.getConn();
		PreparedStatement ps = conn.prepareStatement("select id,name,salary from emp");
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			System.out.println("name == "+rs.getString(1));
			System.out.println("nmae == "+rs.getString(2));;
			System.out.println("nmae == "+rs.getString(3));;
		}
		DBManager.close(rs,ps,conn);
	}
	/**
	 * 查询  10000 次  未使用连接池耗时:63717
	 * @throws SQLException
	 */
	public static void test1() throws SQLException {
		Connection conn = DBManager.createConn();
		PreparedStatement ps = conn.prepareStatement("select id,name,salary from emp");
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			System.out.println("name == "+rs.getString(1));
			System.out.println("nmae == "+rs.getString(2));;
			System.out.println("nmae == "+rs.getString(3));;
		}
		DBManager.close(rs,ps,conn);
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java的艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值