一 连接池概念
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
二 思路
- 指定初始化连接数目程序启动时就执行创建
- 指定最大连接数目
- 指定当前使用连接数目
三 实现过程
- 指定全局变量:初始化数目,最大连接数,当前连接数,连接池集合
- 构造函数:循环创建 “初始化数目” 连接
- 数据库连接方法
- 获取连接
- 池中有连接,直接拿
- 池中没有连接,判断是否达到做大连接数;达到,抛出异常;没有达到最大连接数,创建新的连接
- 释放和连接(连接放回集合中)
四 代码
package utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
/**
* Created by pc on 2017/9/10.
*/
public class MyConnectionPool {
int init_count = 3; //初始化链接数目
int max_count = 10; //最大链接数
int current_count = 0; //记录当前使用的链接数
//连接池:存放所有的初始化链接
public LinkedList<Connection> pool = new LinkedList<Connection>();
//1.构造函数,初始化连接放入连接池
public MyConnectionPool(){
for (int i = 0;i < init_count;i++){
current_count++;//记录当前连接数
//把链接加到连接池
pool.addLast(creatConnection());
}
}
//2.创建一个新的链接方法
public Connection creatConnection(){
try{
Class.forName("com.mysql.jdbc.Driver");//加载驱动
String url = "jdbc:mysql://localhost:3306/test";//加载数据库链接
String user = "root";//配置用户名
String password = "root";//配置密码
return DriverManager.getConnection(url,user,password);//获取链接
}catch (Exception e){
throw new RuntimeException(e);
}
}
//3.获取链接
public Connection getConnection(){
//池中有链接直接拿
if (pool.size() > 0){
return pool.removeFirst();//将第一个list集合删除并返回
}
//池中没有链接,判断是否达到最大连接数;如果没有,创建新的链接
if (current_count < max_count){
//记录当前使用的连接数
current_count++;
//创建链接
return creatConnection();
}
//达到最大链接,抛出异常
throw new RuntimeException("当前已经达到最大连接数");
}
//4.释放链接
public void realeaseConnection(Connection conn){
//判断:连接池中数目如果小于初始化连接,就放入池中
if (pool.size() < init_count){
pool.addLast(conn);
}else {
try {
//关闭连接
current_count--;
conn.close();
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
}
结果显示
网友评论