自定義數據連接池

package com.ghsy.mypool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.ResourceBundle;

public class MyJdbcUtilsPool {
	//聲明一個連接池對象-用linkedList
	private static LinkedList<Connection> pool=new LinkedList<Connection>();
	//初始化連接池-將多個連接放入連接池中
	static{
		//獲取連接-根據properties文件獲取連接,直接用JdbcUtils類
		//0.通過資源束對象獲取properties文件中的數據庫連接的配置信息
		ResourceBundle resourceBundle=ResourceBundle.getBundle("jdbcinfo");//只需要文件名,無需擴展名
		String driver=resourceBundle.getString("driver");
		String url=resourceBundle.getString("url");
		String user=resourceBundle.getString("user");
		String password=resourceBundle.getString("password");
		try {
			//1.註冊驅動
			Class.forName(driver);
			System.out.println("池中初始化的三個連接:");
			for (int i = 0; i < 3; i++) {
				//2.驅動管理者處獲取連接
				Connection connection = DriverManager.getConnection(url, user,
						password);
				//3.將連接放入到連接池中
				pool.add(connection);
				System.out.println(connection);
			}
			System.out.println("--------------------------------");
		} catch (Exception e) {
			throw new RuntimeException();
		}
		
	}
	//從連接池中獲取連接,同時從連接池中移除當前獲得的連接
	public static Connection getConnection(){
		//判斷池中是否有連接,否則可能出現空指針
		if(pool.size()>0){
			Connection connection=pool.removeFirst();
			return connection;
		}else{
			//如果池子中沒有,等待一下,再來
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return getConnection();
		}	
	}

	/**
	 * 釋放連接--名稱雖然叫closeResource,這只是從某一個使用當前連接的線程而言。
	 * 實際上是需要將連接歸還到連接池中,也就是對連接池對象linkedlist對象的插入操作。
	 * @param connection
	 * @param statement
	 * @param resultSet
	 */
	public static void closeResource(Connection connection,Statement statement,ResultSet resultSet){
		//注意做非空判斷,要不可能出現空指針異常的
		try {
			//不要關閉連接,歸還至數據庫
			if(connection!=null)
			pool.add(connection);
			//打印一下吧
			System.out.println("歸還"+connection);
		}finally{
			try {
				if(statement!=null)
				statement.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException();
			}finally{
				try {
					if(resultSet!=null)
					resultSet.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException();
				}
			}
		}	
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章