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();
}
}
}
}
}