package test;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class ConnectionPool {
//ConnectionPool 中连接的个数
private int linkedNo = 0;
//活动的个数
private int activeNo = 0;
//驱动类
private String driver = null;
//连接路径
private String url = null;
//用户名
private String userName = null;
//密码
private String password = null;
//空闲的Connection
private LinkedList<Connection> leisureConn = null;
//使用中的Connection
private LinkedList<Connection> usingConn = null;
//线程池类的对象
private static ConnectionPool connectionPool = null;
//封装好ConnectionPool对象
public static ConnectionPool newInstance(int linkedNo,String driver,String url,String userName,String password)
{
if(connectionPool == null)
{
connectionPool = new ConnectionPool(linkedNo,driver,url,userName,password);
}
return connectionPool;
}
//获取Connection池对象
public static ConnectionPool getInstance()
{
return connectionPool;
}
//初始化各个参数的值
private ConnectionPool(int linkedNo,String driver,String url,String userName,String password){
this.linkedNo = linkedNo;
this.driver = driver;
this.url = url;
this.userName = userName;
this.password = password;
leisureConn = new LinkedList<Connection>();
usingConn = new LinkedList<Connection>();
}
//获取数据库的连接
public synchronized Connection getConnection()
{
Connection conn = null;
//判断可用连接是否为空,以及活动的个数是否大于可连接个数
if(leisureConn.isEmpty()&&activeNo==linkedNo)
{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(leisureConn.isEmpty())
{
throw new NullPointerException("没有可用的连接对象");
}
//从可用连接中获取一个连接对象
conn = leisureConn.getFirst();
leisureConn.removeFirst();
usingConn.addLast(conn);
}else if(activeNo<linkedNo)
{
conn = buildConnection(driver, url, userName, password); //创建连接对象
usingConn.addLast(conn); //将其加入到使用连接集合中
activeNo++;
return conn;
}else
{
conn = usingConn.getFirst(); //从空闲连接中获取连接对象
usingConn.removeFirst(); // 从空闲连接中移除
usingConn.addLast(conn); //将其加入到使用连接集合中
}
return conn;
}
public synchronized void closeConnection(Connection closeConn) {
int i = 0;
for(; i < usingConn.size(); i++) {
Connection conn = usingConn.get(i);
if(conn.equals(closeConn)) {
break;
}
}
if(i == usingConn.size()) throw new ClassCastException("你使用的连接不是我们这的...");
usingConn.remove(i); //从使用连接集合中删除连接对象
leisureConn.add(closeConn); // 将使用完毕的连接放回空闲连接集合中
}
//建立连接,Connection池的建立
private Connection buildConnection(String driver,String url,String userName,String password)
{
Connection conn = null;
Connection proxy = null;
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
// System.out.println(url);
conn = DriverManager.getConnection(url,userName,password);
//调用反射机制来进行Close()方法的处理。
proxy = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),
conn.getClass().getInterfaces(), new ConnectionInvocationHandler(conn));
} catch (SQLException e) {
e.printStackTrace();
}
return proxy;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
数据库连接池的实现(很完整(支持多种数据库
共18个文件
java:6个
class:6个
properties:3个
3星 · 超过75%的资源 需积分: 50 46 下载量 132 浏览量
2011-03-09
17:20:15
上传
评论 1
收藏 13KB RAR 举报
温馨提示
这个数据库连接池的实现,包含了源代码,从配置文件读取驱动等相关信息支持Oracle和sql server等多种数据库,里面有写好的测试类
资源推荐
资源详情
资源评论
收起资源包目录
连接池.rar (18个子文件)
连接池
.project 385B
bin
test
Test.class 1KB
JDBCConnection.class 1KB
ConnectionDataSource.class 3KB
ConnectionInvocationHandler.class 1KB
ConnectionPool.class 4KB
PropertiesTest.class 2KB
hello.properties 0B
.settings
suchen
db.files 126B
hello.properties 100B
src
test
PropertiesTest.java 982B
Test.java 786B
ConnectionInvocationHandler.java 716B
ConnectionPool.java 3KB
ConnectionDataSource.java 2KB
JDBCConnection.java 1000B
hello.properties 0B
.classpath 291B
共 18 条
- 1
资源评论
- 汤去三面2013-03-14谢谢。非常有用。
- tang08272013-11-23可惜我要的是c++的,不过也谢谢
- 天马座的流星拳2018-09-05JAVA的也不直说,还以为是C#的呢,C币白花了,差评!
- 马sang2016-09-15不是我想要的资料
liudehuasl
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功