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());
}
}
}

最新文章

  1. php后台增删改跳转
  2. Codeforces Round #388 (Div. 2) - C
  3. Win7全自动精简批处理_温柔处理极速修正版/暴力剩女工程测试版
  4. Struts2:国际化
  5. Objective-C语法简记
  6. java实现smtp邮件发送
  7. LeetCode Maximum Subarray (最大子段和)
  8. setSelection()和requestFocusFromTouch()
  9. 【转】BLE开发的各种坑
  10. Oracle 11g XML java连接
  11. openstack中文文档
  12. Ring3下干净的强行删除文件
  13. 1.Linux下libevent和memcached安装
  14. Linux 安装Python37
  15. iOS 自定义底部tabbar加号按钮实现方法
  16. python语言学习--2
  17. 面试回顾——List&lt;T&gt;排序
  18. Supervisor (进程管理利器) 使用说明 - 运维笔记
  19. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周
  20. Cobbler自动装机--1

热门文章

  1. jmeter中beanshell postprocessor结合fastjson库提取不确定个数的json参数
  2. VFB FEEDBACK
  3. (xxx) is not defined at HTMLInputElement.onblur(Day_27)
  4. SpringMVC=&gt;web.xml基本配置
  5. [leetcode] 872. 叶子相似的树(周赛)
  6. Guava-retry,java重试组件
  7. 『动善时』JMeter基础 — 37、将JMeter测试结果写入Excel
  8. 从7nm到5nm,半导体制程
  9. Python脚本语言写法
  10. 深度学习加速器堆栈Deep Learning Accelerator Stack