使用连接池的目的:
频繁的获取与关闭Connecitoon对象会耗费太多资源
连接池的作用:
用获取连接池的连接来代替新建连接。
用将连接归还给连接池来代替关闭连接。
JAVA常用连接池:C3P0,DBCP。
连接池的原理与实现细节:
建立连接池时自动创建多个空闲连接,数目由InitialSize属性决定。
每当获取一个连接池中的连接,此连接便被占用。
当空闲连接小于连接池的最小空闲连接时,自动创建一批新的连接,直到达到最大连接数为止。
当最大连接数的连接全部被占用时,会出现拥塞。
当空闲连接大于连接池的最大空闲连接时,自动收回一批连接。
DBCP工具类代码实现(创建连接池,获取连接,归还连接):
<span style="font-size:14px;">package util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
/**
* @author ZP
* 管理连接的工具类(连接池)
*/
public class DBUtil {
//Sun对连接池提供了统一的接口:DataSource
//由不同的厂商加以实现,其实现类不同。
//一个项目有一个连接池就够了,它能创建很多连接。
private static BasicDataSource ds;
static{
//1.读取连接参数。
Properties p = new Properties();
try {
p.load(DBUtil.class
.getClassLoader()
.getSystemResourceAsStream("util/db.properties")); //使用ClassLoader获取流对象。
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String user = p.getProperty("user");
String pwd = p.getProperty("pwd");
int initialSize = new Integer(p.getProperty("initialSize"));
int maxActive = new Integer(p.getProperty("maxActive"));
//String转int
//三种方法:new Integer(String s)/Integer.parseInt(String s)/Integer.valueOf(String s)
//2.创建连接池并设置参数。
//连接的参数
ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(pwd);
//连接池的参数
ds.setInitialSize(initialSize); //初始化连接的参数。(有默认值)
ds.setMaxActive(maxActive); //最大的连接数。
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("读取资源文件失败",e);
}
}
//用创建好的db代替了DriverManager拿取一个连接。
//异常建议抛出。
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
/*
* 连接池创建的连接,该连接的close方法被重写了
* 调用时,仅仅是将连接归还给池。
*/
public static void close(Connection con){
if(con != null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("归还连接失败",e);
}
}
}
}</span>