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