package com.jsx.utils;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.Vector;
public class ConnectionPool {
private String jdbcDriver = ""; // 数据库驱动
private String dbUrl = ""; // 数据 URL
private String dbUsername = ""; // 数据库用户名
private String dbPassword = ""; // 数据库用户密码
private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表
private int initialConnections = 10; // 连接池的初始大小
private int incrementalConnections = 5; // 连接池自动增加的大小
private int maxConnections = 50; // 连接池最大的大小
private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为 null
// 它中存放的对象为 PooledConnection 型
/**
* 构造函数
* @param jdbcDriver
* String JDBC 驱动类串
* @param dbUrl
* String 数据库 URL
* @param dbUsername
* String 连接数据库用户名
* @param dbPassword
* String 连接数据库用户的密码
*/
public ConnectionPool(String jdbcDriver, String dbUrl, String dbUsername,String dbPassword) {
this.jdbcDriver = jdbcDriver;
this.dbUrl = dbUrl;
this.dbUsername = dbUsername;
this.dbPassword = dbPassword;
try {
createPool();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 返回连接池的初始大小
* @return 初始连接池中可获得的连接数量
*/
public int getInitialConnections() {
return this.initialConnections;
}
/**
* 设置连接池的初始大小
* @param 用于设置初始连接池中连接的数量
*/
public void setInitialConnections(int initialConnections) {
this.initialConnections = initialConnections;
}
/**
* 返回连接池自动增加的大小 、
* @return 连接池自动增加的大小
*/
public int getIncrementalConnections() {
return this.incrementalConnections;
}
/**
* 设置连接池自动增加的大小
* @param 连接池自动增加的大小
*/
public void setIncrementalConnections(int incrementalConnections) {
this.incrementalConnections = incrementalConnections;
}
/**
* 返回连接池中最大的可用连接数量
* @return 连接池中最大的可用连接数量
*/
public int getMaxConnections() {
return this.maxConnections;
}
/**
* 设置连接池中最大可用的连接数量
* @param 设置连接池中最大可用的连接数量值
*/
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
/**
* 获取测试数据库表的名字
* @return 测试数据库表的名字
*/
public String getTestTable() {
return this.testTable;
}
/**
* 设置测试表的名字
* @param testTable
* String 测试表的名字
*/
public void setTestTable(String testTable) {
this.testTable = testTable;
}
/**
* 创建一个数据库连接池,连接池中的可用连接的数量采用类成员
* initialConnections 中设置的值
*/
public synchronized void createPool() throws Exception {
// 确保连接池没有创建
// 如果连接池己经创建了,保存连接的向量 connections 不会为空
if (connections != null) {
return; // 如果己经创建,则返回
}
// 实例化 JDBC Driver 中指定的驱动类实例
Driver driver = (Driver) (Class.forName(this.jdbcDriver).newInstance());
DriverManager.registerDriver(driver); // 注册 JDBC 驱动程序
// 创建保存连接的向量 , 初始时有 0 个元素
connections = new Vector();
// 根据 initialConnections 中设置的值,创建连接。
createConnections(this.initialConnections);
System.out.println(" 数据库连接池创建成功! ");
}
/**
*
* 创建由 numConnections 指定数目的数据库连接 , 并把这些连接
* 放入 connections 向量中
* @param numConnections
* 要创建的数据库连接的数目
*/
private void createConnections(int numConnections) throws SQLException {
// 循环创建指定数目的数据库连接
for (int x = 0; x < numConnections; x++) {
// 是否连接池中的数据库连接的数量己经达到最大?最大值由类成员 maxConnections
// 指出,如果 maxConnections 为 0 或负数,表示连接数量没有限制。
// 如果连接数己经达到最大,即退出。
if (this.maxConnections > 0
&& this.connections.size() >= this.maxConnections) {
break;
}
// add a new PooledConnection object to connections vector
// 增加一个连接到连接池中(向量 connections 中)
try {
connections.addElement(new PooledConnection(newConnection()));
} catch (SQLException e) {
System.out.println(" 创建数据库连接失败! " + e.getMessage());
throw new SQLException();
}
//System.out.println(" 数据库连接己创建 ......");
}
}
/**
* 创建一个新的数据库连接并返回它
* @return 返回一个新创建的数据库连接
*/
private Connection newConnection() throws SQLException {
// 创建一个数据库连接
Connection conn = DriverManager.getConnection(dbUrl, dbUsername,dbPassword);
// 如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的
// 最大客户连接数目
// connections.size()==0 表示目前没有连接己被创建
if (connections.size() == 0) {
DatabaseMetaData metaData = conn.getMetaData();
int driverMaxConnections = metaData.getMaxConnections();
// 数据库返回的 driverMaxConnections 若为 0 ,表示此数据库没有最大
// 连接限制,或数据库的最大连接限制不知道
// driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数目
// 如果连接池中设置的最大连接数量大于数据库允许的连接数目 , 则置连接池的最大
// 连接数目为数据库允许的最大数目
if (driverMaxConnections > 0
&& this.maxConnections > driverMaxConnections) {
this.maxConnections = driverMaxConnections;
}
}
return conn; // 返回创建的新的数据库连接
}
/**
* 通过调用 getFreeConnection() 函数返回一个可用的数据库连接 ,
* 如果当前没有可用的数据库连接,并且更多的数据库连接不能创
* 建(如连接池大小的限制),此函数等待一会再尝试获取。
* @return 返回一个可用的数据库连接对象
*/
public synchronized Connection getConnection() throws SQLException {
// 确保连接池己被创建
if (connections == null) {
return null; // 连接池还没创建,则返回 null
}
Connection conn = getFreeConnection(); // 获得一个可用的数据库连接
// 如果目前没有可以使用的连接,即所有的连接都在使用中
while (conn == null) {
// 等一会再试
wait(250);
conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果
// getFreeConnection() 返回的为 null
// 则表明创建一批连接后也不可获得可用连接
}
return conn; // 返回获得的可用的连接
}
/**
*
* 本函数从连接池向量 connections 中返回一个可用的的数据库连接,如果
* 当前没有可用的数据库连接,本函数则根据 incrementalConnections 设置
* 的值创建几个数据库连接,并放入连接池中。
* 如果创建后,所有的连接仍都在使用中,则返回 null
* @return 返回一个可用的数据库连接
*/
private Connection getFreeConnection() throws SQLException {
// 从连接池中获得一个可用�
没有合适的资源?快使用搜索试试~ 我知道了~
数据库连接池案例包括c3p0,druid,和自己手写的连接池
共38个文件
class:10个
java:9个
jar:6个
5星 · 超过95%的资源 需积分: 17 10 下载量 91 浏览量
2017-11-28
18:44:39
上传
评论
收藏 5.23MB ZIP 举报
温馨提示
数据库连接池案例包括c3p0连接池案例,druid连接池案例,和自己手写的连接池
资源推荐
资源详情
资源评论
收起资源包目录
数据库连接池案例.zip (38个子文件)
数据库连接池案例
user.sql 813B
Demo_my
.project 383B
bin
com
jsx
utils
ConnectionPool$PooledConnection.class 1KB
ConnectionPool.class 7KB
JdbcUtil.class 8KB
test
Test.class 2KB
.settings
org.eclipse.jdt.core.prefs 598B
src
com
jsx
utils
JdbcUtil.java 9KB
ConnectionPool.java 15KB
test
Test.java 647B
.classpath 379B
lib
mysql-connector-java-5.1.12-bin.jar 716KB
Demo_druid
.project 386B
bin
com
jsx
utils
DBUtil.class 3KB
JdbcUtil.class 7KB
test
Test.class 2KB
.settings
org.eclipse.jdt.core.prefs 598B
db.properties 423B
src
com
jsx
utils
JdbcUtil.java 9KB
DBUtil.java 3KB
test
Test.java 653B
.classpath 596B
lib
mysql-connector-java-5.1.12-bin.jar 716KB
druid-1.1.5.jar 2.53MB
Demo_c3p0
.project 385B
bin
com
jsx
utils
DBUtil.class 3KB
JdbcUtil.class 7KB
test
Test.class 2KB
.settings
org.eclipse.jdt.core.prefs 598B
笔记
笔记 772B
db.properties 276B
src
com
jsx
utils
JdbcUtil.java 9KB
DBUtil.java 3KB
test
Test.java 649B
.classpath 592B
lib
c3p0-0.9.2-pre4.jar 405KB
mysql-connector-java-5.1.12-bin.jar 716KB
mchange-commons-java-0.2.2.jar 551KB
共 38 条
- 1
资源评论
- caixiuying22017-12-07没下载成功,暂不评论
心歌技术
- 粉丝: 2812
- 资源: 94
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功