⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectionpool .java

📁 Title:数据库连接池 Description: 通用的数据库连接池 通用的数据库连接池 可以设置: 加载的驱动 连接的URL 数据库的用户名 数据库的名字 最大连接数 默认创建数量 Copyrig
💻 JAVA
字号:
package cn.freekl.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import java.io.Serializable;
import java.sql.*;

/**
 * <p>
 * Title:数据库连接池
 * </p>
 * <p>
 * Description: 通用的数据库连接池
 * 
 * <pre>
 *       		通用的数据库连接池
 *       		可以设置:
 *       			加载的驱动
 *       			连接的URL
 *       			数据库的用户名
 *       			数据库的名字
 *       			最大连接数
 *       			默认创建数量
 *       		
 * </pre>
 * 
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: www.gdc8888.com
 * </p>
 * 
 * @author zjchxj
 * @version 1.0
 */

public class ConnectionPool {

	// 连接池的管理器,首先初始化,仅仅有一个对象,管理连接池
	private static ConnectionPool connPool;

	// 没有用过的连接池,用vector实现同步
	private static Vector<Connection> noUseConnectionPool = new Vector<Connection>();

	// 正在用的连接池
	private static HashMap<Connection, Connection> nowUseConnectionPool = new HashMap<Connection, Connection>();

	// 连接驱动
	private static String dbDriver = "sun.jdbc.odbc.JdbcOdbcDriver";

	// 连接URL
	private static String dbUrl = "jdbc:odbc:testpool";

	// 数据库用户名
	private static String userName = "";

	// 数据库密码
	private static String userPassword = "";

	// 最大连接池数量
	private static int MAX_POOL = 100;

	// 默认创建数量
	private static int DEFAULT_POOL = 2;

	// 是否已经初始化过
	private static boolean isInit = false;

	// 是否自动提交事务
	private static boolean isAutoCommit = false;

	// 默认的构造方法
	private ConnectionPool() {
		try {
			ConnectionPool.initConnection();
		} catch (Exception e) {
			System.out.println("初始化连接出错");
			e.printStackTrace();
		}

	}

	/**
	 * 初始化连接
	 * 
	 * @throws Exception
	 */
	public static void initConnection() throws Exception {
		System.out.println("初始化连接池开始..........");
		try {
			Class.forName(dbDriver);
		} catch (Exception e) {
			System.out.println("加载连接驱动出错?");
			e.printStackTrace();
		}

		synchronized (noUseConnectionPool) {
			for (int i = 0; i < DEFAULT_POOL; i++) {
				Connection conn = createConnection(dbDriver, dbUrl, userName,
						userPassword);
				noUseConnectionPool.add(conn);
			}
		}
		isInit = true;
		System.out.println("初始化连接池完成..........");

	}

	/**
	 * 设置数据库连接的配置
	 * 
	 * @param String
	 *            driver 连接数据库的驱动
	 * @param String
	 *            url 连接数据库的URL
	 * @param String
	 *            name 数据库的用户名
	 * @param String
	 *            password 数据为的密码
	 * @param String
	 *            max 连接池最大的连接数
	 * @param String
	 *            defalut 默认创建的连接数
	 */
	public static void setDBConfig(String driver, String url, String name,
			String password, int max, int defalut, boolean isCommit) {
		dbDriver = driver;
		dbUrl = url;
		userName = name;
		userPassword = password;
		MAX_POOL = max;
		DEFAULT_POOL = defalut;
		isAutoCommit = isCommit;
	}

	/**
	 * 通过连接池获得真正的链接
	 * 
	 * @return 连接
	 * @throws java.sql.SQLException
	 */
	public static synchronized Connection getConnection()
			throws java.sql.SQLException {

		if (!isInit) {
			connPool = new ConnectionPool();// 使用默认的初始化
		}

		if (nowUseConnectionPool.size()-noUseConnectionPool.size() >= MAX_POOL) {
			throw new SQLException("连接数已经达到最大数");
		}

		Connection conn = null;

		if (noUseConnectionPool.size() > 0) { // 里面是否有连接
			conn = (Connection) noUseConnectionPool.firstElement();//取第一个出来
			noUseConnectionPool.remove(conn);//从noUseConnectionPool删除刚取出来的连接
		}

		// 如果数据库连接池没有链接了,自己创建一个
		if (conn == null) {
			
			conn = createConnection(dbDriver, dbUrl, userName, userPassword);
		} else if (conn.isClosed()) {
			nowUseConnectionPool.remove(conn);// 正在使用的连接删除已经关闭的连接
			conn = createConnection(dbDriver, dbUrl, userName, userPassword);// 重新建立一个连接
		}
		conn.setAutoCommit(isAutoCommit);// 是否自动提交事务
		nowUseConnectionPool.put(conn, conn);// 在正在使用的连接池添一个连接下来
		return conn;
	}
	
	
	/**
	 * 显示数据库连接池的一些相关信息
	 */
	public static void showPoolInfo(){
		System.out.println("*****************************************");
		System.out.println("数据库连接驱动:"+dbDriver);
		System.out.println("数据库连接URL:"+dbUrl);
		System.out.println("数据库用户名:"+userName);
		System.out.println("数据库密码:"+userPassword);
		System.out.println("连接池最大连接数:"+MAX_POOL);
		System.out.println("默认创建连接数:"+DEFAULT_POOL);
		System.out.println("是否自动提交事务:"+(isAutoCommit?"是":"否"));
		
		System.out.println("正在使用的连接数:"+nowUseConnectionPool.size());
		System.out.println("空闲的连接数:"+noUseConnectionPool.size());		
		System.out.println("*****************************************");
	}

	/**
	 * 释放连接
	 * 
	 * @param Connection
	 *            conn 要关闭的连接
	 * @param Boolean
	 *            isCommit 是否需要提交事务
	 */
	public static void releaseConnection(Connection conn, boolean isCommit) {
		System.out.println("释放连接");
		try {

			if (isCommit)
				conn.commit();
			else
				conn.rollback();

			nowUseConnectionPool.remove(conn);
			if (noUseConnectionPool.size() + nowUseConnectionPool.size() < MAX_POOL) {
				synchronized (noUseConnectionPool) {
					noUseConnectionPool.add(conn);
				}
			} else {
				conn.close();
			}
		} catch (Exception e) {
			System.out.println("释放资源出错");
			e.printStackTrace();
		}
		System.out.println("正在使用的连接数=" + nowUseConnectionPool.size());
	}

	/**
	 * 释放全部正在使用的连接
	 * 
	 * @param boolean
	 *            isCommit 是否提交事务
	 */
	public static void releaseAllConnection(boolean isCommit) {
		for (Iterator it = nowUseConnectionPool.values().iterator(); it
				.hasNext();) {
			Object obj = it.next();
			Connection conn = (Connection) obj;
			it.remove();// 必须加这句。不然很可能会报错
			// java.util.ConcurrentModificationException
			releaseConnection(conn, isCommit);

		}

	}

	public static void main(String[] args) throws Exception {
		ConnectionPool.setDBConfig("sun.jdbc.odbc.JdbcOdbcDriver",
				"jdbc:odbc:testpool", "", "", 10, 2, true);

		ThreadTest t1 = new ThreadTest("1");
		ThreadTest t2 = new ThreadTest("2");
		ThreadTest t3 = new ThreadTest("3");
		ThreadTest t4 = new ThreadTest("4");
		ThreadTest t5 = new ThreadTest("5");
		ThreadTest t6 = new ThreadTest("6");
		ThreadTest t7 = new ThreadTest("7");
		ThreadTest t8 = new ThreadTest("8");
		ThreadTest t9 = new ThreadTest("9");
		ThreadTest t10 = new ThreadTest("10");

		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
		t7.start();
		t8.start();
		t9.start();
		t10.start();
		showPoolInfo();
		Thread.sleep(2 * 1000);

		ConnectionPool.releaseAllConnection(true);
		showPoolInfo();

		// 测试模拟20个客户
		for (int i = 0; i < 10; i++) {
			try {
				// xxxx 一般为属性文件读取

				Connection conn = ConnectionPool.getConnection();
				System.out.println(conn);
				// ConnectionPool.releaseConnection(conn, true);
				System.out.println("正在使用的连接数=" + nowUseConnectionPool.size());

			} catch (SQLException ex1) {
				ex1.printStackTrace();
				// 处理异常
			}

		}
		showPoolInfo();
		 ConnectionPool.releaseAllConnection(true);
		 System.out.println("-----------------------------------");
		 // 测试模拟20个客户
		 for (int i = 0; i <20; i++) {
		 try {
		 // xxxx 一般为属性文件读取
		
		 Connection conn = ConnectionPool.getConnection();
		 System.out.println(conn);
		 // ConnectionPool.releaseConnection(conn, true);
		
		 } catch (SQLException ex1) {
		 ex1.printStackTrace();
		 // 处理异常
		 }
		
		 }

	}

	/**
	 * 设置连接数据库驱动
	 * 
	 * @param dbDriver
	 */
	public static void setDbDriver(String dbDriver) {
		ConnectionPool.dbDriver = dbDriver;
	}

	/**
	 * 设置连接数据库的URL
	 * 
	 * @param dbUrl
	 */
	public static void setDbUrl(String dbUrl) {
		ConnectionPool.dbUrl = dbUrl;
	}

	/**
	 * 设置默认创建好的连接数
	 * 
	 * @param default_pool
	 */
	public static void setDEFAULT_POOL(int default_pool) {
		DEFAULT_POOL = default_pool;
	}

	/**
	 * 设置是否自动提交事务
	 * 
	 * @param isAutoCommit
	 */
	public static void setAutoCommit(boolean isAutoCommit) {
		ConnectionPool.isAutoCommit = isAutoCommit;
	}

	/**
	 * 设置连接池的最大容量
	 * 
	 * @param max_pool
	 */
	public static void setMAX_POOL(int max_pool) {
		MAX_POOL = max_pool;
	}

	/**
	 * 设置数据库的用户名
	 * 
	 * @param userName
	 */
	public static void setUserName(String userName) {
		ConnectionPool.userName = userName;
	}

	/**
	 * 设置数据库的密码
	 * 
	 * @param userPassword
	 */
	public static void setUserPassword(String userPassword) {
		ConnectionPool.userPassword = userPassword;
	}

	// 如果连接池没有链接了,就需要产生一个链接
	private static Connection createConnection(String driver, String url,
			String user, String password) throws java.sql.SQLException {		
		Connection conn = DriverManager.getConnection(url, user, password);		
		return conn;
	}

}

class ThreadTest extends Thread {
	private String test;

	public ThreadTest(String test) {
		this.test = test;
	}

	public void run() {
		try {
			System.out.println(test);
			ConnectionPool.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -