1、底层实现类(DBConnection)

  

 package JDBC.JDBCPool.MyJDBCPool;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Vector; /**
* Created by Administrator on 2018/3/10 0010.
*/
public class DBConnection {
private String password;
private String url;
private String user;
private int normalConn;
private int maxConn;
private Vector<Connection> freeConnections = new Vector<Connection>();
private static int num = 0;// 空闲的连接数
private static int numActive = 0;// 当前的连接数
private int checkedOut; public DBConnection(String password, String url, String user,
int normalConn, int maxConn) {
this.password = password;
this.url = url;
this.user = user;
this.maxConn = maxConn;
this.normalConn = normalConn;
for (int i = 0; i < normalConn; i++) { // 初始normalConn个连接
Connection c = newConnection();
if (c != null) {
freeConnections.addElement(c);
num++;
}
}
}
// 创建一个新连接 private Connection newConnection() {
Connection con = null;
try {
if (user == null) { // 用户,密码都为空
con = DriverManager.getConnection(url);
} else {
con = DriverManager.getConnection(url, user, password);
}
System.out.println("连接池创建一个新的连接");
} catch (SQLException e) {
System.out.println("无法创建这个URL的连接" + url);
return null;
}
return con;
} public synchronized Connection getConnection() {
Connection con=null;
if(freeConnections.size()>0) {
num--;//调用之后,空闲的连接就减少一个
con = (Connection) freeConnections.firstElement();
freeConnections.removeElementAt(0);
try {
if (con.isClosed()) {
System.out.println("从连接池删除了一个无效连接");
con = getConnection();
}
} catch (SQLException e) {
System.out.println("从连接池删除了一个无效连接");
con = getConnection();
}
}else if(maxConn==0||checkedOut<maxConn){
con=newConnection();
}
if(con!=null){//当前连接数+1
checkedOut++;
}
numActive++;
return con;
} public int getnumActive() {
return numActive;
} public int getnum(){//获取空闲连接数目
return num;
} public synchronized void release(){
Enumeration allConnections=freeConnections.elements();
while(allConnections.hasMoreElements()){
Connection con=(Connection)allConnections.nextElement();
try {
con.close();
num--;
} catch (SQLException e) {
System.out.println("无法关闭连接池中的连接");
}
}
freeConnections.removeAllElements();
numActive=0;
}//释放空闲的链接 public synchronized void freeConnection(Connection con){
freeConnections.addElement(con);
num++;//空闲的链接增加一个
checkedOut--;
numActive--;
notifyAll();
}
}

2、连接池接口代码

  

 package JDBC.JDBCPool.MyJDBCPool;

 import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException; /**
* Created by Administrator on 2018/3/10 0010.
*/
public class DBPool {
private String password = "root";// 密码
private String url = "jdbc:mysql://localhost/bz?useSSL=false";// 连接URL
private String user = "root";// 用户名
private String driverName = "com.mysql.jdbc.Driver";// 驱动类
private int normalConnect = 10;// 保持连接数
private int maxConn=0;
private DBConnection dbPool=null;
private static DBPool instance = null; // 定义唯一实例
Driver driver = null;// 驱动变量 private DBPool(){
loadDrivers(driverName);
createPool();
} public void loadDrivers(String driverName){
String driverClassName=driverName;
try {
driver =(Driver)Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);//注册驱动需要的是驱动程序的实例
System.out.println("成功注册JDBC驱动程序" + driverClassName);
} catch(Exception e){
System.out.println("注册JDBC驱动程序失败");
}
} public void createPool(){
dbPool=new DBConnection(password,url,user,normalConnect,maxConn);
if(dbPool!=null){
System.out.println("数据库连接池成功创建");
}else{
System.out.println("数据库连接池创建失败");
}
}//创建一个连接池 public static synchronized DBPool getInstance() {
if (instance == null) {
instance = new DBPool();
}
return instance;
}//调用构造函数返回一个独有的连接池 public Connection getConnection() {
if (dbPool!= null) {
return dbPool.getConnection();
}
return null;
} public int getnumActive() {
return dbPool.getnumActive();
}//获取有效连接数目 public int getnum(){
return dbPool.getnum();
}//获取空闲连接数目 public void freeConnection(Connection con) {
if (dbPool != null) {
dbPool.freeConnection(con);
}
} public synchronized void release(){
dbPool.release();
try {
DriverManager.deregisterDriver(driver);
System.out.println("撤销JDBC驱动程序"+driver.getClass().getName()+"成功");
} catch (SQLException e) {
System.out.println("无法撤销JDBC驱动程序的注册:"+driver.getClass().getName());
}
}
}

三、测试类

  

package JDBC.JDBCPool.MyJDBCPool;

import java.sql.Connection;

/**
* Created by Administrator on 2018/3/10 0010.
*/
public class Test {
public Test(){} public static void main(String[] args) {
DBPool dbPool=DBPool.getInstance();
System.out.println(dbPool.getnumActive());
System.out.println(dbPool.getnum());
Connection con1=dbPool.getConnection();
System.out.println(dbPool.getnumActive());
System.out.println(dbPool.getnum());
dbPool.release();
}
}

JDBC创建mysql连接池代码的更多相关文章

  1. Swoole4-swoole创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...

  2. swoole4创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机.   解决方案:连接池,这个连接池建立了200个和mysql的连接,这100 ...

  3. mysql连接池的使用工具类代码示例

    mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...

  4. redis mysql 连接池 之 golang 实现

    1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...

  5. JDBC连接池原理、自定义连接池代码实现

    首先自己实现一个简单的连接池: 数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AU ...

  6. C# 基于创建一个mysql 连接池

    创建一个连接池操作类 using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using Syste ...

  7. eclipse下jdbc数据源与连接池的配置及功能简介

    今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急 ...

  8. MySQL连接池

    1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...

  9. workerman如何写mysql连接池

    首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...

随机推荐

  1. 2015 Multi-University Training Contest 2 1006 Friends 壮压

    题目链接 题意:t 组測试数据,每组測试数据有 n个人,m条关系 每条关系能够是 "线上关系" 或者 "线下关系". 要求每一个人的线上关系(条数) == 线下 ...

  2. centos 下 KVM虚拟机的创建、管理与迁移

    kvm虚拟机管理 一.环境 role         hostname    ip                  OS kvm_server   target      192.168.32.40 ...

  3. ubuntu解压命令全览(rar)

    sudo apt-get install p7zip-full Ubuntu下解压rar文件的方法 2010-05-13 12:47 一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了 ...

  4. 英语发音规则---W字母

    英语发音规则---W字母 一.总结 一句话总结: 1.W在单词开头发[w]? week [wiːk] n. 周,星期 win [wɪn] vt. 赢得 wake [weɪk] vi. 醒来 sweet ...

  5. numpy的scale就是 x-mean/std

    >>> from sklearn import preprocessing >>> import numpy as np >>> a=np.arr ...

  6. Spring学习笔记(一) 简介

    版权声明 本文是摘自IBM上Naveen Balani的一篇文章,原文请点击此处:http://www.ibm.com/developerworks/cn/java/wa-spring1/ Sprin ...

  7. BZOJ 3729 splay维护DFS序+博弈论

    思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...

  8. SparkSQL 与 Spark Core的关系

    不多说,直接上干货! SparkSQL 与 Spark Core的关系 Spark SQL构建在Spark Core之上,专门用来处理结构化数据(不仅仅是SQL). Spark SQL在Spark C ...

  9. 关于div中图片水平垂直居中的问题

    最近在做一个项目,里面涉及到不固定尺寸要在div里面水平垂直居中显示 我没有用table布局,而是用了div+css,找了很久,终于在网上找到解决方案,特此记录备用 关键核心代码如下: <div ...

  10. sql server 授权相关命令

    原文:https://blog.csdn.net/hfdgjhv/article/details/83834076 https://www.cnblogs.com/shi-yongcui/p/7755 ...