简易版JDBC连接池
2024-09-15 10:48:44
JDBC连接池mini版的实现
首先是工具类 DbUtil
- 主要参数就是Driver、User、PWD等啦,主要用于建立连接
- URL需要注意的是SSL和serverTimezone参数,和mysql驱动版本有关
public class DbUtil {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PWD = "123456";
public static Connection getConnection(){
try {
Class.forName(DRIVER);
Connection conn = (Connection) DriverManager.getConnection(URL,USER,PWD);
System.out.println("generate a new connection:"+conn.hashCode());
return conn;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
DBPool连接池
- 设置的一个最大容量为20的连接池
- 使用静态代码块进行初始化,初始化用到的锁会在后面继续介绍
- 主要包含三个方法,建立连接、扩充连接池和回收连接
public class DBPool {
private static final int max = 20;
private static final int min = 5;
private static int poolSize = 0;
private DBPool(){}
private static ConcurrentLinkedQueue<Connection> pool = new ConcurrentLinkedQueue<Connection>();
static {
if (poolSize == 0 && pool.isEmpty()){
synchronized (DBPool.class){
if (poolSize == 0 && pool.isEmpty()){
try {
System.out.println("连接池为空,正在初始化");
for (int i = 0; i < min; i++) {
pool.add(DbUtil.getConnection());
poolSize++;
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
public static Connection getConnection(){
try {
if (!pool.isEmpty()){
System.out.println("获得连接");
return pool.remove();
}else {
System.out.println("正在扩大连接池");
dilatation(5);
System.out.println("正在获得连接");
while (true){
if (!pool.isEmpty()){
System.out.println("获得连接");
return pool.remove();
}
}
}
}catch (Exception e){
e.printStackTrace();
return null;
}
}
public static void dilatation(int num){
if (poolSize > max){
System.out.println("超过连接池最大数量");
return;
}
for (int i = 0; i < num; i++) {
pool.add(DbUtil.getConnection());
poolSize++;
}
}
public static void close(Connection conn){
pool.add(conn);
System.out.println("回收成功");
}
}
JDBCTest测试类
public class JDBCTest {
public static void main(String[] args) {
Connection c1 = DBPool.getConnection();
DBPool.close(c1);
System.out.println("该连接为:"+c1.hashCode());
for (int i = 0; i < 20; i++) {
System.out.println("连接"+i+" :"+DBPool.getConnection());
}
}
}
最新文章
- php后台增删改跳转
- Codeforces Round #388 (Div. 2) - C
- Win7全自动精简批处理_温柔处理极速修正版/暴力剩女工程测试版
- Struts2:国际化
- Objective-C语法简记
- java实现smtp邮件发送
- LeetCode Maximum Subarray (最大子段和)
- setSelection()和requestFocusFromTouch()
- 【转】BLE开发的各种坑
- Oracle 11g XML java连接
- openstack中文文档
- Ring3下干净的强行删除文件
- 1.Linux下libevent和memcached安装
- Linux 安装Python37
- iOS 自定义底部tabbar加号按钮实现方法
- python语言学习--2
- 面试回顾——List<;T>;排序
- Supervisor (进程管理利器) 使用说明 - 运维笔记
- 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周
- Cobbler自动装机--1
热门文章
- jmeter中beanshell postprocessor结合fastjson库提取不确定个数的json参数
- VFB FEEDBACK
- (xxx) is not defined at HTMLInputElement.onblur(Day_27)
- SpringMVC=>;web.xml基本配置
- [leetcode] 872. 叶子相似的树(周赛)
- Guava-retry,java重试组件
- 『动善时』JMeter基础 — 37、将JMeter测试结果写入Excel
- 从7nm到5nm,半导体制程
- Python脚本语言写法
- 深度学习加速器堆栈Deep Learning Accelerator Stack