- 浏览: 12775 次
- 性别:
- 来自: 厦门
最新评论
package shop;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
/*
java数据库连接池实现(转载)
作用:
在数据库存取中,数据库连接池是不可缺少的,它可以提高连接利用率
减少连接等待,对于提高数据存储性能会有不小的作用.
原理:
连接池相当于连接的集合,在连接池初始化时先实例化一定数量的空闲连接
等待用户使用,用户使用完连接再将其返回连接池,这样就免去了最耗时的
创建连接的开销在没有空闲连接的情况下,连接池将自动生成连接再分配给
用户请求.
实例:
*/
/*
* 我的数据库连接池
*
* **********模块说明**************
*
* getInstance()返回POOL唯一实例,第一次调用时将执行构造函数
* 构造函数Pool()调用驱动装载loadDrivers()函数;连接池创建createPool()函数 loadDrivers()装载驱动
* createPool()建连接池 getConnection()返回一个连接实例 getConnection(long time)添加时间限制
* freeConnection(Connection con)将con连接实例返回到连接池 getnum()返回空闲连接数
* getnumActive()返回当前使用的连接数
*
*/
public class Pool {
private static Pool instance = null; // 定义唯一实例
private int maxConnect = 100;// 最大连接数
private int normalConnect = 10;// 保持连接数
private String password = "";// 密码
private String url = "jdbc:mysql://localhost/shop";// 连接URL
private String user = "root";// 用户名
private String driverName = "com.mysql.jdbc.Driver";// 驱动类
Driver driver = null;// 驱动变量
DBConnectionPool pool = null;// 连接池实例变量
// 将构造函数私有,不允许外界访问
private Pool() {
loadDrivers(driverName);
createPool();
}
// 装载和注册所有JDBC驱动程序
private void loadDrivers(String dri) {
String driverClassName = dri;
try {
driver = (Driver) Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);
System.out.println("成功注册JDBC驱动程序" + driverClassName);
} catch (Exception e) {
System.out.println("无法注册JDBC驱动程序:" + driverClassName + ",错误:" + e);
}
}
// 创建连接池
private void createPool() {
pool = new DBConnectionPool(password, url, user, normalConnect,
maxConnect);
if (pool != null) {
System.out.println("创建连接池成功");
} else {
System.out.println("创建连接池失败");
}
}
// 返回唯一实例
public static synchronized Pool getInstance() {
if (instance == null) {
instance = new Pool();
}
return instance;
}
// 获得一个可用的连接,如果没有则创建一个连接,且小于最大连接限制
public Connection getConnection() {
if (pool != null) {
return pool.getConnection();
}
return null;
}
// 获得一个连接,有时间限制
public Connection getConnection(long time) {
if (pool != null) {
return pool.getConnection(time);
}
return null;
}
// 将连接对象返回给连接池
public void freeConnection(Connection con) {
if (pool != null) {
pool.freeConnection(con);
}
}
// 返回当前空闲连接数
public int getnum() {
return pool.getnum();
}
// 返回当前连接数
public int getnumActive() {
return pool.getnumActive();
}
// 关闭所有连接,撤销驱动注册
public synchronized void release() {
// /关闭连接
pool.release();
// /撤销驱动
try {
DriverManager.deregisterDriver(driver);
System.out.println("撤销JDBC驱动程序 " + driver.getClass().getName());
} catch (SQLException e) {
System.out
.println("无法撤销JDBC驱动程序的注册:" + driver.getClass().getName());
}
}
}
package shop;
//数据池文件
import java.sql.*;
import java.util.*;
import java.util.Date;
public class DBConnectionPool {
private int checkedOut;
private Vector<Connection> freeConnections = new Vector<Connection>();
private int maxConn;
// private int normalConn;
private String password;
private String url;
private String user;
private static int num = 0;// 空闲的连接数
private static int numActive = 0;// 当前的连接数
public DBConnectionPool(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++;
}
}
}
// 释放不用的连接到连接池
public synchronized void freeConnection(Connection con) {
freeConnections.addElement(con);
num++;
checkedOut--;
numActive--;
notifyAll();
}
// 创建一个新连接
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 int getnum() {
return num;
}
// 返回当前连接数
public int getnumActive() {
return numActive;
}
// 获取一个可用连接
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) { // 没有空闲连接且当前连接小于最大允许值,最大值为0则不限制
con = newConnection();
}
if (con != null) { // 当前连接数加1
checkedOut++;
}
numActive++;
return con;
}
// 获取一个连接,并加上等待时间限制,时间为毫秒
public synchronized Connection getConnection(long timeout) {
long startTime = new Date().getTime();
Connection con;
while ((con = getConnection()) == null) {
try {
wait(timeout);
} catch (InterruptedException e) {
}
if ((new Date().getTime() - startTime) >= timeout) {
return null; // 超时返回
}
}
return con;
}
// 关闭所有连接
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;
}
}
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
/*
java数据库连接池实现(转载)
作用:
在数据库存取中,数据库连接池是不可缺少的,它可以提高连接利用率
减少连接等待,对于提高数据存储性能会有不小的作用.
原理:
连接池相当于连接的集合,在连接池初始化时先实例化一定数量的空闲连接
等待用户使用,用户使用完连接再将其返回连接池,这样就免去了最耗时的
创建连接的开销在没有空闲连接的情况下,连接池将自动生成连接再分配给
用户请求.
实例:
*/
/*
* 我的数据库连接池
*
* **********模块说明**************
*
* getInstance()返回POOL唯一实例,第一次调用时将执行构造函数
* 构造函数Pool()调用驱动装载loadDrivers()函数;连接池创建createPool()函数 loadDrivers()装载驱动
* createPool()建连接池 getConnection()返回一个连接实例 getConnection(long time)添加时间限制
* freeConnection(Connection con)将con连接实例返回到连接池 getnum()返回空闲连接数
* getnumActive()返回当前使用的连接数
*
*/
public class Pool {
private static Pool instance = null; // 定义唯一实例
private int maxConnect = 100;// 最大连接数
private int normalConnect = 10;// 保持连接数
private String password = "";// 密码
private String url = "jdbc:mysql://localhost/shop";// 连接URL
private String user = "root";// 用户名
private String driverName = "com.mysql.jdbc.Driver";// 驱动类
Driver driver = null;// 驱动变量
DBConnectionPool pool = null;// 连接池实例变量
// 将构造函数私有,不允许外界访问
private Pool() {
loadDrivers(driverName);
createPool();
}
// 装载和注册所有JDBC驱动程序
private void loadDrivers(String dri) {
String driverClassName = dri;
try {
driver = (Driver) Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);
System.out.println("成功注册JDBC驱动程序" + driverClassName);
} catch (Exception e) {
System.out.println("无法注册JDBC驱动程序:" + driverClassName + ",错误:" + e);
}
}
// 创建连接池
private void createPool() {
pool = new DBConnectionPool(password, url, user, normalConnect,
maxConnect);
if (pool != null) {
System.out.println("创建连接池成功");
} else {
System.out.println("创建连接池失败");
}
}
// 返回唯一实例
public static synchronized Pool getInstance() {
if (instance == null) {
instance = new Pool();
}
return instance;
}
// 获得一个可用的连接,如果没有则创建一个连接,且小于最大连接限制
public Connection getConnection() {
if (pool != null) {
return pool.getConnection();
}
return null;
}
// 获得一个连接,有时间限制
public Connection getConnection(long time) {
if (pool != null) {
return pool.getConnection(time);
}
return null;
}
// 将连接对象返回给连接池
public void freeConnection(Connection con) {
if (pool != null) {
pool.freeConnection(con);
}
}
// 返回当前空闲连接数
public int getnum() {
return pool.getnum();
}
// 返回当前连接数
public int getnumActive() {
return pool.getnumActive();
}
// 关闭所有连接,撤销驱动注册
public synchronized void release() {
// /关闭连接
pool.release();
// /撤销驱动
try {
DriverManager.deregisterDriver(driver);
System.out.println("撤销JDBC驱动程序 " + driver.getClass().getName());
} catch (SQLException e) {
System.out
.println("无法撤销JDBC驱动程序的注册:" + driver.getClass().getName());
}
}
}
package shop;
//数据池文件
import java.sql.*;
import java.util.*;
import java.util.Date;
public class DBConnectionPool {
private int checkedOut;
private Vector<Connection> freeConnections = new Vector<Connection>();
private int maxConn;
// private int normalConn;
private String password;
private String url;
private String user;
private static int num = 0;// 空闲的连接数
private static int numActive = 0;// 当前的连接数
public DBConnectionPool(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++;
}
}
}
// 释放不用的连接到连接池
public synchronized void freeConnection(Connection con) {
freeConnections.addElement(con);
num++;
checkedOut--;
numActive--;
notifyAll();
}
// 创建一个新连接
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 int getnum() {
return num;
}
// 返回当前连接数
public int getnumActive() {
return numActive;
}
// 获取一个可用连接
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) { // 没有空闲连接且当前连接小于最大允许值,最大值为0则不限制
con = newConnection();
}
if (con != null) { // 当前连接数加1
checkedOut++;
}
numActive++;
return con;
}
// 获取一个连接,并加上等待时间限制,时间为毫秒
public synchronized Connection getConnection(long timeout) {
long startTime = new Date().getTime();
Connection con;
while ((con = getConnection()) == null) {
try {
wait(timeout);
} catch (InterruptedException e) {
}
if ((new Date().getTime() - startTime) >= timeout) {
return null; // 超时返回
}
}
return con;
}
// 关闭所有连接
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;
}
}
发表评论
-
Android中的“再按一次返回键退出程序”实现[转]
2012-05-23 17:10 1347用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的 ... -
几种Java数据库连接池实现(三)<2>
2012-04-18 09:35 798ackage pool; //连接池调度线程 public ... -
几种Java数据库连接池实现(三)<1>
2012-04-18 09:34 739package pool; import java.lang. ... -
几种Java数据库连接池实现(二)
2012-04-18 09:32 619import java.io.*; import java.s ... -
转 java连接池实现
2012-04-14 15:13 821本人亲测转的这个贴有一些问题,只供参考 功能完善的Java ... -
Java Socket(转载)
2012-04-09 11:12 728Sockets let you send raw stream ...
相关推荐
Java数据连接池,描述了几种Java与数据库进行连接的方式。
数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信...
NULL 博文链接:https://alex295111.iteye.com/blog/726809
针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;...
主要介绍了Java数据库连接池的几种配置方法(以MySQL数据库为例) 的相关资料,需要的朋友可以参考下
程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统...
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种...通过pool连接池提高性能,并将数据库数据直接转成json对象,且封装了几种取值方式。比传统的ojdbc性能更快更高效
数据库连接的几种方法,连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc ...
连接数据库的几种方式 JAVA编程语言和JDBC JDBC编程的步骤 通过ODBC建立连接 通过SQLSERVER 提供的驱动程序获得连接 通过ORACLE提供的驱动程序获得连接 通过数据源获得连接 通过连接池获得连接 总结数据库...
Java数据库操作的几种方式 基于Java实现。 项目内容 项目简介 项目起因 本项目主要提供Java操作数据的几种方式示例。 项目框架 db-jdbc: 基于JDBC实现 db-dhcp: 基于数据库连接池实现 db-mybatis: 基于Mybatis框架...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...