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

简易版JDBC连接池的更多相关文章

  1. 四大流行的jdbc连接池之C3P0篇

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  3. JDBC连接池-C池3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

  4. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...

  5. JDBC连接池-自定义连接池

    JDBC连接池 java JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  .关闭  ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...

  6. Jmeter(九)JDBC连接池

    JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL ...

  7. jdbc连接池&改进dbUtil成C3P0Util

    一.jdbc连接池 1.连接池的存在理由   前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装.但它依旧采取从驱动管理获取连接 (DriverManager.getConnection ...

  8. Tomcat 的 JDBC 连接池

    JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Comm ...

  9. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

随机推荐

  1. 北航OO(2020)第四单元博客作业暨学期总结

    一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...

  2. 浅尝js垃圾回收机制

    局部作用域内的变量,在函数执行结束之后就会被js的垃圾回收机制销毁   为什么要销毁局部变量? => 为了释放内存   js垃圾回收机制何时会销毁局部变量 : 如果局部变量无法再得到访问,就会被 ...

  3. 企业CRM系统选型的标准有哪些?

    随着市场的发展,企业开始意识到客户的重要性.越来越多的企业形成了"以客户为核心"的理念,更加注重客户数据和管理,因此CRM客户关系管理系统成为企业的首选.选择一个适合企业的CRM系 ...

  4. [bug]mysql: The server time zone value '&#214;&#208;&#185;&#250;&#177;&#234;&#215;&#188;&#202;&#177;&#188;&#228;' is unrecognized or represents more than one time zone

    原因: 时区设置有误 解决: 在mysql中修改时区设置: 或 在JDBC代码中增加时区设置: Connection c = DriverManager.getConnection("jdb ...

  5. Python基础 小白[7天]入门笔记

    笔记来源 Day-1 基础知识(注释.输入.输出.循环.数据类型.随机数) #-*- codeing = utf-8 -*- #@Time : 2020/7/11 11:38 #@Author : H ...

  6. Docker镜像的仓库及底层依赖的核心技术(3)

    一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...

  7. System Verilog MCDF(二)

    整形器的接口时序: reg,grant是维持了两个clk的. chid ,length在发送数据期间不可以变化. 第一个data数据必须在start上升沿的同一个clk发送. reg,grant两者之 ...

  8. 太赞了!Python竟可以轻松实现音频格式无损转换

    大家好,我是辰哥 辰哥在平时处理音频格式的时候,需要去下载各种音频处理软件(专业一点的软件还要收费),掌握Python技术的我们,知道Python是万能的(哈哈哈,开个玩笑).今天辰哥就来教大家用Py ...

  9. IDEA debug ConcurrentLinkedQueue时抽风

    1. 介绍 如标题所见,我在使用IDEA debug ConcurrentLinkedQueue的Offer方法时,发生了下面的情况. 代码如下: ConcurrentLinkedQueue<s ...

  10. Nginx 配置实例-配置高可用

    Nginx 配置实例-配置高可用 1. 实现效果 2. 两台机器 nginx 的安装 2.1 192.168.25.120 中 nginx 的安装 2.1.1 安装 pcre 依赖 2.1.2 安装其 ...