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