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.减少 ...
随机推荐
- 让VMware ESXi虚拟交换机支持VLAN
眼下虚拟化应用比較广泛,通常情况下.一台物理主机在安装VMware ESXi或Hyper-V虚拟机软件后.能够在一台物理主机上创建多个虚拟机,而且创建的每一个虚拟机能够像原来的物理一样对外提供服务,这 ...
- EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)
一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...
- WebService概述和CXF入门小程序
一. 什么是WedService? WebService不是框架, 甚至不是一种技术, 而是一种跨平台,跨语言的规范, WebService的出现是为了解决这种需求场景: 不同平台, 不同语言所编写的 ...
- 大型Web 站点 Asp.net Session过期你怎么办
在 WEB 系统中. 我们通常会用session来保存一些简单可是却非常重要的信息.比方Asp.net中常常会用Session来保存用户登录信息,比方UserID.为了解决 WEB场大家採用了把ses ...
- Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in query at index 189......
Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in query ...
- 【转】用CocoaPods做iOS程序的依赖管理 -- 不错
原文网址:http://blog.devtang.com/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 文档更新说明 2012-12-02 ...
- MYSQL中 FIND_IN_SET 函数
每天掌握一点,你的知识财富就多一点 今天在维护项目的时候发现了个MYSQL的FIND_IN_SET函数,之前接触太浅,今天又涨点知识了.下面是做个测试 1.创建一张test表,并添加数据 2.编写s ...
- ubuntu sublime text 2 破解版
原网地址 : http://blog.csdn.net/icephone/article/details/8217567 关于sublime text 2 的一个使用教程以及前端的不错的学习博客 ht ...
- BZOJ 2212线段树的合并
借鉴(抄)了一下题解-- 线段树合并的裸题吧- //By SiriusRen #include <cstdio> #include <cstring> #include < ...
- 欢迎来到SQL学院
给学习SQL的同学的福利@ http://sqlschool.modeanalytics.com/ 第一部分 学习SQL 本教程是专为那些想用数据回答问题的人们而设计的.从很大程度上讲,SQL是数据分 ...