mysql数据库连接池 手动编写
源码来源于http://www.toutiao.com/a6350448676050174209/,留存以供以后参考学习
先上一张项目托普图

然后分别列出各个文件的源码:
MyPool.java(就是个接口)
package com.audi; public interface MyPool
{
PoolConnection getConnection();
void createConnections(int count);
}
MyPoolImpl.java(接口的实现类)
package com.audi; import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector; import com.mysql.jdbc.Driver; public class MyPoolImpl implements MyPool
{
private static String jdbcDriver = "";
private static String jdbcUrl = "";
private static String userName = "";
private static String password = "";
private static int initCount;
private static int stepSize;
private static int poolMaxSize; private static Vector<PoolConnection> poolConnections = new Vector<PoolConnection>(); public MyPoolImpl()
{
// TODO Auto-generated constructor stub
init();
} private void init()
{
// TODO Auto-generated method stub
// 读取配置文件
InputStream in = MyPoolImpl.class.getClassLoader()
.getResourceAsStream("mysqlConnection.properties");
// InputStream inputStream = new in
Properties pro = new Properties();
try
{
// 装载配置文件输入流
pro.load(in);
} catch (Exception e)
{
// TODO: handle exception
}
// 从配置文件中读取出配置参数
jdbcDriver = pro.getProperty("jdbcDriver");
jdbcUrl = pro.getProperty("jdbcUrl");
userName = pro.getProperty("userName");
password = pro.getProperty("password");
initCount = Integer.valueOf(pro.getProperty("initCount"));
stepSize = Integer.valueOf(pro.getProperty("stepSize"));
poolMaxSize = Integer.valueOf(pro.getProperty("poolMaxSize")); try
{
// 获取驱动对象并注册
Driver driver = (Driver) Class.forName(jdbcDriver).newInstance();
DriverManager.registerDriver(driver);
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
// 创建一定数量的初始链接
createConnections(initCount);
} @Override
public PoolConnection getConnection()
{
// TODO Auto-generated method stub
if (poolConnections.size() <= 0)
{
System.out.println("链接池为空,获取数据库链接失败!!!");
throw new RuntimeException("链接池为空,获取数据库链接失败!!!");
}
PoolConnection connection = getRealConnection(); // 如果没有成功的获取链接就创建一定数量的链接 并从中获取一个有效链接
while(connection == null)
{
createConnections(stepSize);
connection = getRealConnection();
try
{
// 这里睡眠的原因时考虑到第一次获取链接失败,可能有多个线程在等待链接资源,所以当前线程先等待一下,避开高峰
Thread.sleep(300);
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
return connection;
} // 注意有synchronized关键字
private synchronized PoolConnection getRealConnection()
{
// TODO Auto-generated method stub
for (PoolConnection conn : poolConnections)
{
// 如果当前链接空闲则返回该链接对象
if (!conn.isBusy())
{
Connection connection = conn.getConn();
try
{
// 判断获得的链接是否是有效的,如果无效就创建一个新的链接 isValid方法其实就是在定时时间到的时候执行一下sql语句
if (!connection.isValid(2000))
{
Connection validConn = DriverManager.getConnection(jdbcUrl, userName, password);
conn.setConn(validConn);
}
} catch (Exception e)
{
// TODO: handle exception
}
}
conn.setBusy(true);
return conn;
}
return null;
} // 创建链接
@Override
public void createConnections(int count)
{
// TODO Auto-generated method stub
if (poolMaxSize > 0 && poolConnections.size() + count > poolMaxSize)
{
System.out.println("创建链接对象失败,因为数据库链接数量已达上限!!");
throw new RuntimeException("创建链接对象失败,因为数据库链接数量已达上限!!");
} // 否则就开始创建链接
for (int i = 0; i < count; i++)
{
try
{
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
// 封装链接对象 并存入vecter
PoolConnection poolConnection = new PoolConnection(conn, false);
poolConnections.add(poolConnection);
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }
PoolConnection.java(里面会进行一些连接参数的配置)
package com.audi; import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; public class PoolConnection
{
private Connection conn;
private boolean isBusy = false; public Connection getConn()
{
return conn;
} public void setConn(Connection conn)
{
this.conn = conn;
} public boolean isBusy()
{
return isBusy;
} public void setBusy(boolean isBusy)
{
this.isBusy = isBusy;
} public PoolConnection(Connection conn,boolean isBusy)
{
this.conn = conn;
this.isBusy = isBusy;
} public ResultSet querySql(String sql)
{
ResultSet resultSet = null;
Statement statement = null;
try
{
statement = conn.createStatement();
resultSet = statement.executeQuery(sql);
} catch (Exception e)
{
// TODO: handle exception
}
return resultSet;
} public void close()
{
this.isBusy = false;
}
}
PoolManager.java(使用内部类的方式获取连接池对象)
package com.audi; public class PoolManager
{
private static class CreatePool
{
private static MyPoolImpl myPoolImpl= new MyPoolImpl();
} public static MyPoolImpl getInStance()
{
return CreatePool.myPoolImpl;
}
}
最后是测试类
package com.audi; import java.sql.ResultSet; public class TestPool
{
private static MyPoolImpl poolImpl =PoolManager.getInStance(); public static void main(String[] args)
{
// TODO Auto-generated method stub
/*long time= System.currentTimeMillis();
for (int i = 0; i < 2000; i++)
{
System.out.println("第"+i+"次执行");
selecData();
}
System.out.println("運行時間"+(System.currentTimeMillis()-time));*/
// System.out.println(new Date());
//selecData();
// 创建2000个数据库链接线程
long time= System.currentTimeMillis();
for (int i = 0; i < 2000; i++)
{
System.out.println("第"+i+"次执行");
new Thread(new Runnable()
{
public void run()
{
selecData();
}
});
}
System.out.println("運行時間"+(System.currentTimeMillis()-time));
} public synchronized static void selecData()
{
PoolConnection connection = poolImpl.getConnection();
ResultSet resultSet = connection.querySql("select * from Student");
try
{
while (resultSet.next())
{
System.out.println(resultSet.getString("ID")+"\t"+resultSet.getString("NAME")+"\t"+resultSet.getString("AGE"));
}
resultSet.close();
connection.close();
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
}
数据库连接参数配置文件
mysqlConnection.properties
jdbcDriver=com.mysql.jdbc.Driver
jdbcUrl=jdbc\:mysql\://localhost\:3306/test
userName=root
password=w513723
initCount=10
stepSize=5
poolMaxSize=200
mysql数据库连接池 手动编写的更多相关文章
- 一个简单的MySql数据库连接池的实现
package cn.hc.connectionPool; import java.io.IOException; import java.io.InputStream; import java.sq ...
- Python实现Mysql数据库连接池
python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息
1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...
- MySql数据库连接池专题
MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html
- python3 实现mysql数据库连接池
首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...
- MySql数据库连接池
1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...
- mysql数据库连接池使用(二)实现自己的数据库连接池
上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...
- mysql数据库连接池使用(一)dbcp方式的配置
Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...
- node+mysql 数据库连接池
1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
随机推荐
- 一场ACM一场梦——我的一年
听着裁判倒计时比赛结束,看着全场鲜艳的气球,今天的结果是the last result i can image. 过几天给校赛出题,去年此时的我,还从来没有过竞赛的经验,只因为在大学开学前看了一点点c ...
- php中json_decode返回数组或对象的实例
1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行 ...
- 2014028-jQuery与正则表达式[转]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 暑假集训(4)第五弹——— 数论(hdu1222)
题意概括:那天以后,你好说歹说,都快炼成三寸不烂之舍之际,小A总算不在摆着死人脸,鼓着死鱼眼.有了点恢复的征兆.可孟子这家伙说的话还是有点道理,那什么天将降....额,总之,由于贤者法阵未完成,而小A ...
- zedboard 构建嵌入式linux
本文通过五部完成zedboard的嵌入式LINUX搭建,所谓磨刀不五砍材工嘛 1:系统环境搭建 要准备好交叉编译环境 见http://blog.csdn.net/xiabodan/article/de ...
- sql存在一个表而不在另一个表中的数据
(转)A.B两表,找出ID字段中,存在A表,但是不存在B表的数据.A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引. 方法一 使用 not in ,容易理解,效率低 ...
- Java应用短信猫
首先确定短信猫正常连接到主机,并安装SIM卡.先用超级终端测试短息猫能不能用.安装minicom:#sudo apt-get install minicom安装完成后,执行#sudo minicom ...
- 基于ArcGIS API for JavaScript的统计图表实现
感谢原作者分享:https://github.com/shevchenhe/ChartLayer,在使用的过程中,需要自己进行调试修改,主要还是_draw函数,不同的ArcGIS JS API函数有差 ...
- JQuery在iframe中实现 点击后选中当前栏目的样式
二级或者三级折叠菜单参考http://www.cnblogs.com/qigege/p/5178947.html <script type="text/javascript" ...
- 封装鼠标滚轮事件_mousewheel
function mousewheel(obj,fn){ obj.onmousewheel===null ? obj.onmousewheel=fun : obj.addEventListener(' ...