为什么使用连接池呢? 当数据库访问量非常大的时候,普通的数据库直连方式对数据库的压力特别大,消耗资源,举个例子,假设我们有一个特别大的网站,访问量达到了几百万,如果用简单的数据库直连, 就需要建立几百万个数据库连接,很可能会导致数据库崩溃。
比较流行的几个开源数据库连接池的方式: DBCP, C3P0。
DBCP是spring推荐的,C3P0是hibernate推荐的,各有千秋,看情况而定。
下面是简单的使用例子:
DBCP:
首先, 需要的jar文件:
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
commons-logging-1.2.jar
其次在project下建立一个资源文件夹resource, 其中新建一个资源文件dbcp.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ysong
username=root
password=mysql
maxActive=30
maxIdle=10
maxWait=1000
initialSize=5
minIdle=1
removeAbandoned=true
removeAbandonedTimeout=180
这个配置文件中是关于数据库连接池的基本配置。我们在代码中需要这些参数进行连接池的配置。
接下来就是在JDBC中使用连接池, 新建DBCPUtil类:
//数据源
private static DataSource DS;
private static final String configFile = "/dbcp.properties";
//从数据源获得一个链接
public Connection getConn(){
Connection con = null;
if(DS != null){
try{
con = DS.getConnection();
}catch(Exception e){
e.printStackTrace(System.err);
}
try{
con.setAutoCommit(false);
}catch(SQLException e){
e.printStackTrace();
}
return con;
}
return con;
}
public DBCPUtil(){
initDbcp();
}
private static void initDbcp(){
Properties pops = new Properties();
try{
pops.load(Object.class.getResourceAsStream(configFile));
DS = BasicDataSourceFactory.createDataSource(pops);
}catch(Exception e){
e.printStackTrace();
}
}
上面的代码是通过我们的configFile进行配置,其实也可以进行手工配置参数,比如:
public static void initDS(String connectURI, String username, String pswd, String driverClass, int initialSize,int maxTotal, int maxIdle, int maxWait, int minIdle){
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(driverClass);
ds.setUsername(username);
ds.setPassword(pswd);
ds.setUrl(connectURI);
ds.setInitialSize(initialSize);
ds.setMaxTotal(maxTotal);
ds.setMaxIdle(maxIdle);
ds.setMaxWaitMillis(maxWait);
ds.setMinIdle(minIdle);
DS = ds;
}
效果是一样的,但是dbcp.properties的方式比较简单。
这样DBCP数据库连接池就配置好了,使用方式和直连的方式一样,但是运行起来的时间明显会少很多,速度变快。
接下来是C3P0的使用,过程和DBCP相似:
需要的jar文件:
c3p0-0.9.2-pre4.jar
mchange-commons-java-0.2.3.4.jar
同样的在resource文件夹下新建c3p0.properties配置文件:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc\:mysql\://127.0.0.1\:3306/ysong
c3p0.user=root
c3p0.password=mysql
注意c3p0的配置文件有一个前缀c3p0.*
接下来,同样的C3P0Util类:
//这个操作已经加载c3p0.properties配置文件
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static Connection getConnection(){
try{
return ds.getConnection();
}catch(SQLException e){
throw new RuntimeException(e);
}
}
其中ComboPooledDataSource这个类已经自动的加载了c3p0.properties配置文件。
这样c3p0数据库连接池的配置就完成了,使用方式一样。
这里顺便提一下,其他几个比较好用的JDBC替代产品, 比如commons-dbutils, hibernate, myBatis. 这些对数据库操作进行了一些封装,使用起来简单方便,可以尝试。