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

📄 testconnectionpoolsecond.java

📁 springGather 在JAVA环境开发的电信运营支持系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.com.pool;

import java.sql.*; 

import java.util.*; 

import java.io.*;

import org.adam.proxy.*;

/** 

* ConnectionPool 类创建了一个对特定数据库指定大小的连接池。连接池对象 

* 允许客户端指定 JDBC 驱动程序,数据库,使用数据库的用户名和密码。而且, 

* 客户端能指定连接池的在初始创建是产生数据库连接的数量,和指定当连接 

* 不够时每次自动增加连接的数量及连接池最多的数据库连接的数量。 

* 

* 对外提供的方法有: ConnectionPool :构造函数 

* getInitialConnections: 返回连接池初始化大小 

* setInitialConnections: 设置连接池初始化大小 

* getIncrementalConnections: 返回连接池自动增加的增量 

* setIncrementalConnections: 设置连接池自动增加的大小 

* getMaxConnections :获得连接池的最大可允许的连接数 

* setMaxConnections :设置连接池的最大可允许的连接数 

* getTestTable :获得测试表的名字 

* setTestTable :设置测试表的名字 

* createPool: 创建连接池 , 线程己同步 

* getConnection: 从连接池中获得一个数据库连接 

* returnConnection: 返回一个连接到连接池中 

* refreshConnections: 刷新连接池 

* closeConnectionPool: 关闭连接池 

* 

* 

* @author Adam Email: yangjh@tarena.com 

* @version 1.0.2 

* 

*/ 

public class TestConnectionPoolSecond { 

	private String jdbcDriver = ""; // 数据库驱动 

	private String dbUrl = ""; // 数据 URL 

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

	private String dbPassword = ""; // 数据库用户密码 

	private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表 

	private int initialConnections = 0; // 连接池的初始大小 

	private int incrementalConnections = 0;// 连接池自动增加的大小 

	private int maxConnections = 0; // 连接池最大的大小 

	private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为 null 

	private static TestConnectionPoolSecond instance = null;

	private static Properties pro = null;

	//创建一把钥匙!
	private static Object obj = new Object();

	// 它中存放的对象为 PooledConnection 型 

	/** 

	* 构造函数 

	* 

	* @param jdbcDriver String JDBC 驱动类串 

	* @param dbUrl String 数据库 URL 

	* @param dbUsername String 连接数据库用户名 

	* @param dbPassword String 连接数据库用户的密码 

	* 

	*/ 

	private TestConnectionPoolSecond(Properties pro) { 
		this.pro = pro;
		//初始化连接池参数!
		this.init(pro);
		try{
			this.createPool();
		}catch(Exception e){
			e.printStackTrace();
		}
	} 
	/**
	*	使用单例模式的double checked!确保只产生一个实例!
	*	由于JVM允许有多个ClassLoader(),所以该double checked
	*	只成立于被单个ClassLoader所装载的情况!
	*
	*	 @return 该连接池的实例
	*/

	public static TestConnectionPoolSecond getInstance(Properties pro){
		if(instance == null){
			synchronized(obj){
				if(instance == null){
					instance = new TestConnectionPoolSecond(pro);
				}
			}
		}
		return instance;
	}

	/**
	*	初始化连接池参数
	*
	*/

	public void init(Properties props){
		/*Properties props = new Properties();
	try{
        props.load(getFileInputStream());
	}catch(IOException e){
		e.printStackTrace();
	}*/
		//连接池驱动
        jdbcDriver = props.getProperty("driver_name");
		//连接池URL
        dbUrl = props.getProperty("db_url");
		//访问数据库用户名
        dbUsername = props.getProperty("user_name");
		//访问数据库密码
        dbPassword = props.getProperty("password");
		// 连接池的初始大小 
		initialConnections = new Integer(props.getProperty("initialConnections")).intValue(); 
		// 连接池自动增加的大小 
		incrementalConnections = new Integer(props.getProperty("incrementalConnections")).intValue();
		// 连接池最大连接数
		maxConnections = new Integer(props.getProperty("maxConnections")).intValue();
	}

	/**
	*	从properties文件中的属性读到字节流!
	*
	
	private InputStream getFileInputStream(){
        InputStream is = getClass().getResourceAsStream("/properties/jdbcinfo.properties");
        return is;
    }*/

	/** 

	* 返回连接池的初始大小 

	* 

	* @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(); 
			System.out.println("数据库允许创建最大连接数为--->"+driverMaxConnections);

			// 数据库返回的 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) { 

⌨️ 快捷键说明

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