java基础之自定义连接池
当我们对后台数据库进行多次增删改查时,会频繁的调用数据库,会使数据库的工作量加大,而如果定义一个连接池,让访问数据库的程序直接调用连接池里已经准备好了连接,下面就是一个简单地自定义的连接池的实现:
package com.softeem.test.demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
/**
* @Authour: QWL
* @Description:
* @Daete: Created in 2020/12/11 17:33
* @Modified by:
*/
public class MyDataSource {
LinkedList<Connection> list = new LinkedList();
/**
* 驱动类路径
*/
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
/**
* URL地址
*/
private static final String URL = "jdbc:mysql://localhost:3306/test5";
/**
* 登录数据库的账号
*/
private static final String USER = "root";
/**
* 登录数据库的密码
*/
private static final String PASSWORD = "123456";
//初始连接数
int initSize = 1;
//最大连接数
int maxSize = 15;
//被激活的连接数
int activeSize = 0;
//闲置连接数
int idelSize = 0;
//设置最长的等待时间
int MaxWait = 5000;
//加载驱动
static {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//构造器
public MyDataSource() {
}
//添加连接
public void addConnection() {
if (idelSize + activeSize >= maxSize) {
System.out.println("当前连接池全部被占用");
return;
}
try {
list.add(DriverManager.getConnection(URL, USER, PASSWORD));
idelSize++;
} catch (SQLException e) {
e.printStackTrace();
}
}
//等待时间
//TODO
//获取连接
public Connection getConnection() {
if (list.size() <= 0) {
addConnection();
}
Connection conn = list.remove();
try {
if (conn != null || conn.isClosed()) {
//被激活
activeSize++;
//闲置数
idelSize--;
return conn;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//归还连接
public void release(Connection conn) {
try {
if (conn != null && !conn.isClosed()) {
//归还到池中
list.add(conn);
//闲置数增加
idelSize++;
//被激活数减少
activeSize--;
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//创建一个连接池对象
MyDataSource myDataSource = new MyDataSource();
System.out.println("空闲连接数 :" + myDataSource.idelSize);
System.out.println("激活连接数据:" + myDataSource.activeSize);
Connection conn = myDataSource.getConnection();
//获取连接
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
System.out.println(myDataSource.getConnection());
// System.out.println(conn);
System.out.println("空闲连接数 :" + myDataSource.idelSize);
System.out.println("激活连接数据:" + myDataSource.activeSize);
}
}
请求一个新的 Connection 对象会带来大量的开销和很多潜在的错误。为了最小化开销同时减少数据库的压力可以准备好连接,当使用完成后就归还,类似扫码的单车一样,但是可能会使数据库开启时产生较大的等待时间,但是会减少程序运行时的消耗。