package zucc.edu.cn.jdbc.datasource; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; public class MyDataSource { private String url = "jdbc:mysql://localhost:3306/jdbc"; private String user = "root"; private String password = "19980102"; private static int maxCount = 10; // 连接池最大连接数 private static int initCount = 5; // 连接池初始化连接数 private static int currentCount = 0; // 连接池目前连接数 private LinkedList<Connection> connectionPool = new LinkedList<Connection>(); /* * 因为要经常对连接池进行插入删除操作,所以用LinkedList */ public MyDataSource() { /* * 一开始创建成本很高,但是以后建立连接并访问数据库因为是操作内存所以速度很快 */ for (int i = 0; i < initCount; i++) { try { this.connectionPool.addLast(this.createConnection()); this.currentCount++; } catch (SQLException e) { throw new ExceptionInInitializerError(e); } } } public Connection getConnection() throws SQLException { synchronized (connectionPool) { if (this.connectionPool.size() > 0) { return this.connectionPool.removeFirst(); } if (this.currentCount < maxCount) { this.currentCount++; return this.createConnection(); } /* * 如果连接池里还有连接则用removeFirst取连接 如果当前连接数小于最大连接数,则创建连接 */ throw new SQLException("已没有连接"); } } private Connection createConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } /* * 取消对数据库的链接,然后把取消的这个链接放入连接池中 */ public void free(Connection conn) { this.connectionPool.addLast(conn); } }
同时需要对其他的类进行修改
public final class jdbcUtils { // 封装工具类 private String url = "jdbc:mysql://localhost:3306/jdbc"; private String user = "root"; private String password = "19980102"; private static MyDataSource myDataSource = null; //*********更改处************ private static jdbcUtils instance = null;// 单例设计模式,只注册一次驱动 private jdbcUtils() { } public static jdbcUtils getinstance() { if (instance == null) { // 懒加载 instance = new jdbcUtils(); } return instance; } static { try { Class.forName("com.mysql.jdbc.Driver"); myDataSource = new MyDataSource(); //*********更改处************ } catch (ClassNotFoundException e) { e.printStackTrace(); } } public Connection getConnection() throws SQLException { // return DriverManager.getConnection(url, user, password); return myDataSource.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 { if (conn != null) { try { // conn.close(); myDataSource.free(conn); //*********更改处************ } catch (Exception e) { e.printStackTrace(); } } } } } }
主函数
public static void main(String[] args) throws ClassNotFoundException, SQLException { // template(); for (int i = 0; i < 10; i++) { Connection conn = jdbcUtils.getinstance().getConnection(); System.out.println(conn); jdbcUtils.free(null, null, conn); } }
如果主函数不释放链接的话
public static void main(String[] args) throws ClassNotFoundException, SQLException { // template(); for (int i = 0; i < 11; i++) { Connection conn = jdbcUtils.getinstance().getConnection(); System.out.println(conn); // jdbcUtils.free(null, null, conn); } }
执行结果
com.mysql.jdbc.JDBC4Connection@1698c449 com.mysql.jdbc.JDBC4Connection@5ef04b5 com.mysql.jdbc.JDBC4Connection@5f4da5c3 com.mysql.jdbc.JDBC4Connection@443b7951 com.mysql.jdbc.JDBC4Connection@14514713 com.mysql.jdbc.JDBC4Connection@2328c243 com.mysql.jdbc.JDBC4Connection@108c4c35 com.mysql.jdbc.JDBC4Connection@3fa77460 com.mysql.jdbc.JDBC4Connection@e2144e4 com.mysql.jdbc.JDBC4Connection@573fd745 Exception in thread "main" java.sql.SQLException: 已没有连接 at zucc.edu.cn.jdbc.datasource.MyDataSource.getConnection(MyDataSource.java:49) at zucc.edu.cn.jdbc.jdbcUtils.getConnection(jdbcUtils.java:40) at zucc.edu.cn.jdbc.Base.main(Base.java:12)