JDBC创建mysql连接池代码
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连接池代码的更多相关文章
- Swoole4-swoole创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- swoole4创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这100 ...
- mysql连接池的使用工具类代码示例
mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...
- redis mysql 连接池 之 golang 实现
1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...
- JDBC连接池原理、自定义连接池代码实现
首先自己实现一个简单的连接池: 数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AU ...
- C# 基于创建一个mysql 连接池
创建一个连接池操作类 using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using Syste ...
- eclipse下jdbc数据源与连接池的配置及功能简介
今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急 ...
- MySQL连接池
1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...
- workerman如何写mysql连接池
首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...
随机推荐
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
- 关于App class loader的总结
关于App class loader的总结 2010-05-11 15:19:09 分类: 系统运维 Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结起来就是两点 ...
- mysqli数据库操作简单实例
mysqli数据库操作简单实例 代码 结果
- 蓝桥杯--算法提高 排列数 (简单dfs)
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- hdoj--1754--I Hate It(线段树)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 转:Centos 7 使用git 用 ssh 连接github服务器
https://blog.csdn.net/wzq793957419/article/details/68067204 首先Linux下载git,ssh服务都弄好 生成ssh密钥: $ ssh-key ...
- checkbox的使用总结
1 checkbox如何选中时显示内容,不被选中时隐藏内容 <!DOCTYPE html> <html> <head> <meta name="vi ...
- SQL Server 从字符串中提取中文、英文、数字
--[提取中文] IF OBJECT_ID('dbo.fun_getCN') IS NOT NULL DROP FUNCTION dbo.fun_getCN GO create function db ...
- SQL学习——基础语句(4)
前面感觉真的好乱,想哪,写哪.这里慢慢整理…… SQL Having 语句 还是前面的那两个表: grade表: student表: 我们需要查找这里的s_id下的gradeValue的和,这就要分组 ...
- C# Distanct List集合
简单一维集合的使用 List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 }; List<str ...