简易版JDBC连接池
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连接池的更多相关文章
- 四大流行的jdbc连接池之C3P0篇
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- JDBC连接池-C池3P0连接
JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版 c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池 三种方 ...
- JDBC连接池(三)DBCP连接池
JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了 1.JDBC自定义连接池 2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包 (注意:mysql和mysql 驱动 ...
- JDBC连接池-自定义连接池
JDBC连接池 java JDBC连接中用到Connection 在每次对数据进行增删查改 都要 开启 .关闭 ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...
- Jmeter(九)JDBC连接池
JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL ...
- jdbc连接池&改进dbUtil成C3P0Util
一.jdbc连接池 1.连接池的存在理由 前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装.但它依旧采取从驱动管理获取连接 (DriverManager.getConnection ...
- Tomcat 的 JDBC 连接池
JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Comm ...
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
随机推荐
- 折腾Linux内核编译
计网提高实验.指导书给的是远古版本2.6.39.2,轻易在某hub上找到下载地址 查表 看起来Ubuntu 11.04离得最近,遂下一个镜像 懒得上google检索了,编译准备先follow这篇博客试 ...
- 吃透KVM创建虚机和KVM命令
1.创建虚拟机 1.1创建虚拟机磁盘 #使用qemu命令来创建磁盘 qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.2.qcow2 2 ...
- [bug] MySQL 无法删除表
参考 https://blog.csdn.net/smbluesky/article/details/82427121
- JQuery 动态加载 HTML 元素时绑定点击事件无效问题
问题描述 假设项目中有一个列表页面,如下: 当点击列表一行数据可以显示详情页面,而详情页面的数据是根据当前行的数据作为参数,通过 ajax 请求到后台返回的数据,再根据返回的结果动态生成 html 页 ...
- Mac 使用 Parallels Desktop 虚拟机安装 win10 教程
Parallels Desktop 介绍 Parallels Desktop 是一款运行在 Mac 电脑上的极为优秀的虚拟机软件,用户可以在 Mac OS X下非常方便运行 Windows.Linux ...
- nginx 的基础知识(一)
Nginx HTTP 和 反向代理web服务器 epoll 占用少的系统资源.支持更多的并发连接 负载均衡 安装简单.配置灵活 热部署.启动快.不间断服务情况下对软件配置进行升级 反向代理 反向代理 ...
- Navigation 在fragment之间用bundel传递数据
使用 Bundle 对象在目的地之间传递参数 如果您不使用 Gradle,仍然可以使用 Bundle 对象在目的地之间传递参数.创建 Bundle 对象并使用 navigate() 将它传递给目的地, ...
- Django部署uwsgi 与 nginx配置
1.nginx文件的配置 路径:/etc/nginx/conf.d/ example.conf 启动:service nginx [start]/[restart]/[stop] upstream d ...
- Navicat Premium 15 linux 安装与激活 ArchLinux 2021
查看了很多教程花了半小时才弄好可真不容易 参考https://github.com/orginly/navicat-keygen 下载地址 http://www.navicat.com.cn/down ...
- 我的Java资料小栈-START
我的Java资料小栈 前言 在学习Java的这一路中,其实说句实话,自己还是看了很多培训结构出的Java资料,有时候个人觉得培训结构有的东西还是讲的比较通俗易懂的,又想着有些最新的或者个人有时候需要及 ...