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.减少 ...
随机推荐
- Linux 查找一个函数在哪调用
grep "function has" -R ThinkPHP
- webview同步cookies
目前很多android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优 ...
- iOS判断一些权限是否被禁止
iOS中经常会遇到访问相册.相机.麦克疯.蓝牙.以及推送等权限,所以每次我们要使用这些权限是都要记得查看用户是否允许了,如果用户禁止了你的访问权限,你仍然去调取相册或者相机等,那么就会先出现下面的这个 ...
- 分析性能瓶颈的视图:v$session_wait
这是一个寻找性能瓶颈的关键视图.它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件).当系统存在性能问题时,本视图可以做为一个起点指 ...
- 解决问题方法:没有设置对象,app.Config没有配置
- POJ 3624 Charm Bracelet【01背包】
解题思路:直接套公式就能做的01背包, for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[i,v]=max(f[i,v],f[i-1,v-w[i]]+d ...
- Mac Technology Overview
[Mac Technology Overview]https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual ...
- Robot Framework自动化框架搭建的步骤
我把自己之前搭建Robot Framework自动化测试框架的步骤整理了一下,感兴趣的同学可以参考一下. Robot Framework自动化测试框架+ 可视化编辑工具RIDE+Selenium2 ...
- 转:用java调用oracle存储过程总结(比较好理解)
这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励. 一:无返回值的存储过程 存 ...
- 进入docker 容器内命令
docker exec :在运行的容器中执行命令 语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明: -d :分离模式: 在后 ...