首页 > 代码库 > jdbc 链接池

jdbc 链接池

package cn.itcast.jdbc.datasourse;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

public class MyDataSourse {
    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String user = "root";
    private static String pwd = "";
    
    //用于存放链接
    private LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
    
    //初始化链接池时,向链接池内放入10个链接   
    public MyDataSourse(){
        try {
            for(int i = 0;i< 10 ;i++){
                this.connectionsPool.addLast(this.createConnection());
            }
        } catch (SQLException e) {
//            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    //得到链接
    public Connection getConnection(){
        return this.connectionsPool.removeFirst();
    }
    
    //释放链接  如果用链接池的话,当我们要释放资源的时候就不能够简单的把conn给关闭掉,而应该是把conn重新放回到链接池中
    public void free(Connection conn){
        this.connectionsPool.addLast(conn);
    }
    //创建链接
    private Connection createConnection() throws SQLException{
        return DriverManager.getConnection(url,user,pwd);
    }
}
/*
 * 当我们对数据库进行操作时,往往花费在建立和数据库的链接时花费的时间最长,所以最好就是链接保证链接不要
 * 频繁的建立,这时就应该考虑到创建一个链接池,每次用的时候直接从链接池中去取,用完后再放回去
 * 这样做虽然在创建时花费的时间会很长,但是一旦创建完成,在用的时候就能够很好的提高效率
 * */
//////////////////////////////////////此时jdbcUtils包就应该改为这样//////////////////////////////////////////////////////////////////////////

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import cn.itcast.jdbc.datasourse.MyDataSourse;

public final class JdbcUtils {
    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String user = "root";
    private static String password = "";
   // private static MyDataSourse myDataSourse = new MyDataSourse();    //这里myDataSourse不能在这里进行初始化,因为myDataSourse的初始化动作之前需要先注册驱动

  private static MyDataSourse myDataSourse = null;  //此处只需要声明一下,初始化动作放在注册驱动的后面,不然会报初始化异常

    // 私有的构造方法
    private JdbcUtils() {
    }

    // 把注册驱动的动作放在静态代码块内
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");

    myDataSourse = new MyDataSourse();    //初始化动作放在注册驱动的后面


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }

    // 建立链接
    public static Connection getConnection() throws SQLException {
//        return DriverManager.getConnection(url, user, password);
        return myDataSourse.getConnection();
    }

    // 释放资源
    public static void free(ResultSet rs, Statement st, Connection conn) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        //conn.close(); 当使用链接池时,此处就不能够简单的关闭掉该conn了
                        myDataSourse.free(conn);//此时应该把链接conn重新放回到链接池中
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}