1、数据库连接池
1.1概念
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
面试题:什么是数据库连接池?
目前的数据库连接做法:
需要链接数据就马上创建一个连接,使用完成之后,就将连接关闭了。下次使用在创建。。。。。。
实际上数据库的链接操作是比较耗费资源的。如果可以不频繁的创建和关闭连接,可以大幅度的提高效率。
白话数据库连接池:
我们预先创建好一部分连接,放在一个池中(集合),并且将这些连接标记为空闲状态。如果要使用连接就从池中获取一个连接使用,用完之后再次还回池中。
连接池自己应该有自动初始化功能,自动增长功能,自动缩减功能。
所谓自动增长就是当池中的连接都被使用之后,自动创建新的连接放入池中。
所谓自动缩减就是当池中的空闲连接过多时,自动关闭部分连接。
1.2自定义数据库连接池
创建一个类ConnectionPool作为连接池对象。
[1]连接池只能有一个,所以连接池对象应该是单利的。
//提供静态的私有的本类对象
private static ConnectionPool pool;
//构造方法私有化
private ConnectionPool() {
init();//在构造方法中初始化连接池
}
//提供静态的可以获取本类对象的方法。
public synchronized static ConnectionPool getPool() {
if(pool==null)
pool = new ConnectionPool();
return pool;
};
[2]连接池中的属性
//成员属性
//数据库连接属性
private static String driverClass;
private static String userName;
private static String url;
private static String password;
//初始连接数量
private static int initCount = 5;
//最小连接数量
private static int minCount = 5;
//最大连接数量
private static int maxCount = 15;
//当前的连接数量
private static int count;
//使用集合存储连接
LinkedList<Connection> conns = new LinkedList<Connection>();
//成员属性初始化
static {
Properties properties = new Properties();
try {
properties.load(ConnectionPool.class.getClassLoader().getResourceAsStream("db.properties"));
driverClass = properties.getProperty("jdbc.driverclass");
url = properties.getProperty("jdbc.url");
userName = properties.getProperty("jdbc.username");
password = properties.getProperty("jdbc.password");
try {
initCount = new Integer(properties.getProperty("jdbc.initCount"));
} catch (NumberFormatException e) {
System.out.println("initCount使用默认值:"+initCount);
}
try {
minCount = new Integer(properties.getProperty("jdbc.minCount"));
} catch (NumberFormatException e) {
System.out.println("minCount使用默认值:"+minCount);
}
try {
maxCount = new Integer(properties.getProperty("jdbc.maxCount"));
} catch (NumberFormatException e) {
System.out.println("maxCount使用默认值:"+maxCount);
}
} catch (IOException e) {
e.printStackTrace();
}
}
不要忘记添加db.properties
jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.30.21:3306/student?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=1998528Xk
jdbc.initCount=8
jdbc.minCount=8
jdbc.maxCount=20
[3]自动初始化的功能
/**
* 初始化连接池
*/
private void init() {
// 循环的给集合中添加初始化个数个链接
for (int i = 0; i < initCount; i++) {
boolean flag = conns.add(createCon());
if(flag) {
//添加成功之后就将给连接数量+1
count ++;
}
}
System.out.println("连接池初始化完成");
}
/**
* 创建一个可用的数据库连接
* @return
*/
private Connection createCon() {
try {
Class.forName(driverClass);
return DriverManager.getConnection(url, userName, password);
} catch (Exception e) {
throw new RuntimeException("链接创建失败:"+e.getMessage());
}
}
[4]完成自动增长功能
/**
* 池中连接自动增长
*/
private <