java:数据库连接池

一、什么是数据库连接池?

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

二、数据库连接池的运行机制

(1)  程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。



首先到http://sourceforge.net/projects/c3p0/下载相应的jar包,总共三个,如下图所示。

其次将jar包导入到工程当中,然后就可以使用cp30了。

示例代码如下:

package com.zww.server;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ConnectionManager {
//使用单例模式创建数据库连接池
	private static ConnectionManager instance;
	private static ComboPooledDataSource dataSource;
	private ConnectionManager()throws SQLException,PropertyVetoException{
		dataSource=new ComboPooledDataSource();
		dataSource.setUser("root");//用户名
		dataSource.setPassword("345678");//密码
		dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zrr");//数据库地址
		dataSource.setInitialPoolSize(5);//初始化连接数
		dataSource.setMinPoolSize(1);//最小连接数
		dataSource.setMaxPoolSize(20);//最大连接数
		dataSource.setMaxStatements(50);//最长等待时间
		dataSource.setMaxIdleTime(60);//最大空闲时间(毫秒)
	}
	public static final ConnectionManager getInstance(){
		if(instance==null){
			try {
				instance = new ConnectionManager();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return instance;
	}
	public synchronized final Connection getConnection(){
		Connection conn=null;
		try {
			conn=dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

  

package com.zww.server;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionDemo {
public static void main(String[] args) {
	System.out.println("用连接池--------------------");
	for(int i=0;i<20;i++){
		long beginTime=System.currentTimeMillis();
		Connection conn=ConnectionManager.getInstance().getConnection();
		try {
			PreparedStatement pstmt = conn
					.prepareStatement("select * from event ");
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				//do nothing
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		long endTime=System.currentTimeMillis();
		System.out.println("第"+(i+1)+"次执行时间为:"+(endTime-beginTime));
	}
}
}

  测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

原文地址:https://www.cnblogs.com/ipetergo/p/6613017.html