java实现简单的连接池,Java实现简单的数据库连接池代码

package org.apple.connectionpool;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.Collections;

import java.util.Date;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Properties;

import java.util.Set;

import java.util.Timer;

import java.util.TimerTask;

import java.util.Vector;

import java.util.logging.Logger;

public class DbConnectionManager {

private static DbConnectionManager dbConnectionManager = new DbConnectionManager();

private static Properties properties = new Properties();

private static DbConnectionPool pool = null;

static {

try {

properties.load(DbConnectionManager.class.getResourceAsStream("/org/apple/connectionpool/connectionpoll.properties"));

pool = new DbConnectionPool(properties.getProperty("driverClass").trim(), properties.getProperty("url").trim(), properties.getProperty("username").trim(), properties.getProperty("password").trim(), Integer.parseInt(properties.getProperty("minConns").trim()), Integer.parseInt(properties.getProperty("maxConns").trim()));

} catch (IOException e) {

e.printStackTrace();

}

}

public static DbConnectionManager getInstance() {

if (dbConnectionManager != null) {

return dbConnectionManager;

} else {

return new DbConnectionManager();

}

}

public static void main(String[] args) throws SQLException {

for (int i = 0; i < 23; i++) {

Connection connection = DbConnectionManager.getInstance().getConnection();

System.out.println(connection);

DbConnectionManager.getInstance().close(connection);

}

for (int i = 0; i < 10; i++) {

Connection connection = DbConnectionManager.getInstance().getConnection();

System.out.println(connection);

DbConnectionManager.getInstance().close(connection);

}

}

private DbConnectionManager() {

}

public void close(Connection conn) throws SQLException {

if (conn != null) {

pool.freeConnection(conn);

}

}

// ----------对外提供的方法----------

// ----------对外提供的方法----------

public Connection getConnection() {

return pool.getConnection();

}

public void releaseAll() {

pool.releaseAll();

}

}

class DbConnectionPool {

private final static Logger logger = Logger.getLogger(DbConnectionPool.class.getName());

private static Vector freeConnections = new Vector();

private static Map busyConnectionsMap = Collections.synchronizedMap(new HashMap());

/**

* 计时统计

*/

private static Timer timer = new Timer();

private static long timerCount = 0;

private static int timeOut = 30;

static {

// 另起一个线程

new Thread(new Runnable() {

public void run() {

timer.schedule(new TimerTask() {

@Override

public void run() {

if (LogUtil.isDebug()) {

logger.info("----------[清除超时的线程进行清除...----------");

}

if (LogUtil.isInfo()) {

System.out.println("----------[清除超时的线程进行清除...----------");

}

timerCount++;

if (timerCount >= 100000000) {

timerCount = 0;

}

if (LogUtil.isDebug()) {

System.out.println("第" + timerCount + "进行定时清除超时的数据库连接");

}

if (LogUtil.isDebug()) {

System.out.println("----------[清除超时的线程进行清除...----------");

}

Set set = busyConnectionsMap.keySet();

Iterator iterator = set.iterator();

String connectionAndTimeKeyArray = "";

int index = 0;

while (iterator.hasNext()) {

String connectionClassString = iterator.next();

ConnectionAndStartTime connectionAndTime = busyConnectionsMap.get(connectionClassString);

if (new Date().getTime() - connectionAndTime.getStartTime() > timeOut * 1000) {// 大于2分钟

if (index == 0) {

connectionAndTimeKeyArray += connectionClassString;

} else {

connectionAndTimeKeyArray += "," + connectionClassString;

}

index++;

}

}

// 清除

if (connectionAndTimeKeyArray != null && connectionAndTimeKeyArray != "") {

String[] connectionClassStringArray = connectionAndTimeKeyArray.split(",");

for (int i = 0; i < connectionClassStringArray.length; i++) {

if (busyConnectionsMap.get(connectionClassStringArray[i]) != null) {

System.out.println("connectionClassStringArray[i]" + connectionClassStringArray[i]);

busyConnectionsMap.remove(connectionClassStringArray[i]);

if (LogUtil.isDebug()) {

System.out.println("清除超时的Connection:" + connectionClassStringArray[i]);

}

isUsed--;

}

}

}

if (LogUtil.isDebug()) {

System.out.println("当前数据库可用连接" + freeConnections.size());

System.out.println("----------[清除超时的线程进行清除...----------");

System.out.println("----------[清除超时的线程成功]----------");

}

}

// 30秒后执行定时操作:每个10秒检查是否超时

}, 30 * 1000, 10 * 1000);

}

}).start();

if (LogUtil.isInfo()) {

System.out.println("超时处理Connection线程启动");

}

if (LogUtil.isInfo()) {

}

}

private String driverClass;

private String url;

private String username;

private String password;

private int minConns = 5;

private int maxConns = 20;

private static int isUsed = 0;

private int timeout = 1000;

// 构建定时器:自动关闭超时的连接.

/**

* 获取连接

*/

public static int Try_Time = 0;

// 只有这个构造方法

public DbConnectionPool(String driverClass, String url, String username, String password, int minConns, int maxConns) {

this.driverClass = driverClass;

this.url = url;

this.username = username;

this.password = password;

this.minConns = minConns;

this.maxConns = maxConns;

initConnection();

}

private Connection createNewConnection() {

try {

Connection conn = null;

conn = DriverManager.getConnection(url, username, password);

if (LogUtil.isInfo()) {

logger.info("创建了一个新的链接");

}

if (conn != null) {

return conn;

}

} catch (SQLException e) {

if (LogUtil.isInfo()) {

logger.info("获取数据库连接失败" + e);

}

}

// 使用连接数有可能数据库已经达到最大的连接

return null;

}

/**

* 释放连接入连接池

*/

public synchronized void freeConnection(Connection conn) throws SQLException {

if (conn != null && !conn.isClosed()) {

freeConnections.add(conn);

busyConnectionsMap.remove(conn.toString().trim());

if (isUsed >= 1) {

isUsed--;

}

notifyAll();

if (LogUtil.isInfo()) {

logger.info("释放连接!");

}

}

}

public synchronized Connection getConnection() {

if (LogUtil.isInfo()) {

System.out.println("[系统报告]:已用 " + isUsed + " 个连接,空闲连接个数 " + freeConnections.size());

}

// ==========第一种情况

if (freeConnections.size() >= 1) {

if (LogUtil.isInfo) {

System.out.println("[it has free connections]");

}

Connection conn = freeConnections.firstElement();

try {

if (conn.isClosed() || conn == null) {

// 新的连接代替无效连接

conn = createNewConnection();

}

} catch (SQLException e) {

conn = createNewConnection();

}

freeConnections.removeElementAt(0);

isUsed++;

// 记住内存地址

busyConnectionsMap.put(conn.toString().trim(), new ConnectionAndStartTime(conn, new Date().getTime()));

return conn;

}

if (freeConnections.size() <= 0) {

if (LogUtil.isInfo()) {

System.out.println("[now it is getting connection from db]");

}

// ==========第二种情况.1

if (isUsed < maxConns) {

Connection conn = createNewConnection();

if (conn != null) {

isUsed++;

busyConnectionsMap.put(conn.toString().trim(), new ConnectionAndStartTime(conn, new Date().getTime()));

return conn;

} else {

// 再次自身调用自己:可能已经有空的连接存在

return getConnection();

}

}

// ==========第二种情况.2

if (isUsed >= maxConns) {

if (LogUtil.isInfo) {

System.out.println("it has no more connections that is allowed for use");

}

Try_Time++;

if (LogUtil.isInfo) {

System.out.println("***[第" + Try_Time + "尝试从新获取连接]***");

}

if (Try_Time > 10) {

// throw new RuntimeException("***[从新获取数据库连接的失败次数过多]***");

// 多次不能获得连接则返回null

if (LogUtil.isInfo()) {

System.out.println("重复尝试获取数据库连接10次...???等待解决问题");

}

return null;

}

// 连接池已满

long startTime = System.currentTimeMillis();

try {

wait(timeout);

} catch (InterruptedException e) {

// e.printStackTrace();

}

if (new Date().getTime() - startTime > timeout) {

if (LogUtil.isInfo()) {

logger.info("***[没有可获取的链接,正在重试...]***");

}

// 再次自身调用自己

Connection conn = getConnection();

if (conn != null) {

busyConnectionsMap.put(conn.toString(), new ConnectionAndStartTime(conn, new Date().getTime()));

return conn;

} else {

// 再次自身调用自己

return getConnection();

}

}

}

}

return null;

}

private synchronized void initConnection() {

try {

Class.forName(driverClass); // 加载驱动

for (int i = 0; i < minConns; i++) {

Connection conn = createNewConnection();

if (conn != null) {

freeConnections.add(conn);

} else {

throw new RuntimeException("获取的数据库连接为null");

}

}

if (LogUtil.isInfo()) {

logger.info("初始化数据库" + minConns + "个连接放入连接池\n");

}

} catch (ClassNotFoundException e) {

if (LogUtil.isInfo()) {

logger.info("驱动无法加载,请检查驱动是否存在,driver: " + driverClass + e + "\n");

}

}

}

public synchronized void releaseAll() {

Enumeration enums = freeConnections.elements();

while (enums.hasMoreElements()) {

try {

enums.nextElement().close();

} catch (SQLException e) {

if (LogUtil.isInfo()) {

logger.info("关闭链接失败" + e);

}

}

}

freeConnections.removeAllElements();

busyConnectionsMap.clear();

if (LogUtil.isInfo()) {

logger.info("释放了所有的连接");

}

}

}

/**

*

* 记录连接使用的时间

*

*/

class ConnectionAndStartTime {

private Connection conn;

private long startTime;

public ConnectionAndStartTime(Connection conn, long startTime) {

super();

this.conn = conn;

this.startTime = startTime;

}

public Connection getConn() {

return conn;

}

public long getStartTime() {

return startTime;

}

public void setConn(Connection conn) {

this.conn = conn;

}

public void setStartTime(long startTime) {

this.startTime = startTime;

}

}

/**

*

* 记录日志

*

*/

class LogUtil {

public static boolean isDebug = true;

public static boolean isInfo = true;

public static boolean isDebug() {

return isDebug;

}

public static boolean isInfo() {

return isInfo;

}

}

/src/org/apple/connectionpool/connectionpoll.properties

driverClass=oracle.jdbc.driver.OracleDriver

url=jdbc\:oracle\:thin\:@172.18.2.95\:1521\:MYSQL

username=wjt

password=wjt

minConns=1

maxConns=3

package com.etc.oa.util;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.apple.connectionpool.DbConnectionManager;

public class DBUtil {

// ==================================================

public static Connection getConnection() {

Connection conn = null;

conn = DbConnectionManager.getInstance().getConnection();

//conn = DriverManager.getConnection("jdbc:oracle:thin:@172.18.2.95:1521:MYSQL", "wjt", "wjt");

return conn;

}

// ==================================================

/**

* 建立PreparedStatement实例

*/

public static PreparedStatement createPreparedStatement(Connection conn, String sql) throws SQLException {

try {

if (sql != null && conn != null) {

PreparedStatement pstmt = conn.prepareStatement(sql);

if (pstmt != null) {

return pstmt;

}

}

} catch (SQLException e) {

throw e;

}

return null;

}

/**

* pstmt更新操作

*/

public static int pstmtExcuteUpdate(PreparedStatement pst) throws SQLException {

try {

if (pst != null) {

return pst.executeUpdate();

}

} catch (SQLException e) {

throw e;

}

return 0;

}

// ==================================================

// ==================================================

/**

* pstmt查询操作

*/

public static ResultSet pstmtExcuteQuery(PreparedStatement pst) throws SQLException {

try {

if (pst != null) {

ResultSet rs = pst.executeQuery();

if (rs != null) {

return rs;

}

}

} catch (SQLException e) {

throw e;

}

return null;

}

// ====================================================

// ====================================================

public static void close(Connection conn) throws SQLException {

DbConnectionManager.getInstance().close(conn);

}

public static void close(PreparedStatement pst) throws SQLException {

if (pst != null) {

try {

pst.close();

} catch (SQLException e) {

throw e;

}

}

}

public static void close(ResultSet rs) throws SQLException {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

throw e;

}

}

}

// =========================================================

/**

* 快速关闭资源ResultSet rs, PreparedStatement pstmt, Connection conn

*/

public static void close(ResultSet rs, PreparedStatement pst, Connection conn) throws SQLException {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

throw e;

}

}

if (pst != null) {

try {

pst.close();

} catch (SQLException e) {

throw e;

}

}

if (conn != null) {

DbConnectionManager.getInstance().close(conn);

}

}

/**

* 快速关闭资源ResultSet rs, PreparedStatement pstmt

*/

public static void close(ResultSet rs, PreparedStatement pst) throws SQLException {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

throw e;

}

}

if (pst != null) {

try {

pst.close();

} catch (SQLException e) {

throw e;

}

}

}

/**

* 快速关闭资源PreparedStatement pstmt, Connection conn

*/

public static void close(PreparedStatement pst, Connection conn) throws SQLException {

if (pst != null) {

try {

pst.close();

} catch (SQLException e) {

throw e;

}

}

if (conn != null) {

DbConnectionManager.getInstance().close(conn);

}

}

// =========================================================

// =========================================================

/**

* 事务处理

*/

public static void rollback(Connection conn) throws SQLException {

if (conn != null) {

try {

conn.rollback();

} catch (SQLException e) {

throw e;

}

}

}

public static void commit(Connection conn) throws SQLException {

if (conn != null) {

try {

conn.commit();

} catch (SQLException e) {

throw e;

}

}

}

public static void setCommit(Connection conn, Boolean value) throws SQLException {

if (conn != null) {

try {

conn.setAutoCommit(value);

} catch (SQLException e) {

throw e;

}

}

}

public static void main(String[] args) throws SQLException {

Connection connection4 = DbConnectionManager.getInstance().getConnection();

DbConnectionManager.getInstance().close(connection4);

Connection connectiona = DbConnectionManager.getInstance().getConnection();

Connection connectionb = DbConnectionManager.getInstance().getConnection();

Connection connectionc = DbConnectionManager.getInstance().getConnection();

for (int i = 0; i < 10; i++) {

Connection connection8 = DbConnectionManager.getInstance().getConnection();

DbConnectionManager.getInstance().close(connection8);

}

}

}

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值