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. SpringMVC 理论与有用技术(二)文件上传

    文件上传相信大家都做过,差点儿全部的项目都有上传文件的功能,尤其是BS架构的项目中经常被列为常规功能来开发.不管是在开发.NET 项目还是java项目我们会用到非常多的框架,这个功能也被集成到了框架之 ...

  2. When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向

    链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berke ...

  3. 最小生成树基础 (Kruskal)

    最小生成树 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. 在阿里云的iis上安装php扩展

    具体参照http://jingyan.baidu.com/article/11c17a2c5ce349f447e39d6d.html

  5. React 父组件触发子组件事件

    Parent组件 import React from "react"; import Child from "./component/Child"; class ...

  6. [转]Linux+XAMPP+eolinker开源版v3.2.4

    eolinker是一个由国人开源的接口管理系统(AMS),特性及介绍详见开源中国-eolinker首页. 搭建步骤参考:eolinker开源指南 系统环境:CentOS Linux release 7 ...

  7. Spark SQL 编程API入门系列之Spark SQL支持的API

    不多说,直接上干货! Spark SQL支持的API SQL DataFrame(推荐方式,也能执行SQL) Dataset(还在发展) SQL SQL 支持basic SQL syntax/Hive ...

  8. 维基百科 MediaWiki API 解析

    使用开放的 API 做一个自己的小项目,是一个很好的学习方法.但好像开放的 API 选择并不多.这里给大家多一个选择,简单介绍一下维基百科使用的 MediaWiki API. 简介 先简单介绍几个容易 ...

  9. HDU 1176 免费馅饼【动态规划】

    解题思路:用a[i][j]表示在第i秒在地点j的掉落馅饼的数量,设整个馅饼掉落的时间持续为timemax,即为矩阵的高度,一共0到10个地点,为矩阵的长度,如图,即可构成数塔,因为考虑到在地点0的时候 ...

  10. C++利用函数模板得到数组的长度

    #include<iostream> template <typename T, int N> int ArraySize (T (&arr)[N]) { //此处是数 ...