数据库连接池是负责分配、管理、和释放数据库连接的;
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出。
init()初始化资源,
获取连接getConnection
关闭资源(关闭连接)
1. c3p0
2.dbcp
3.proxool
4.druid (阿里提供的 德鲁伊数据库连接池)
5.jakarata
package AnLi; import java.sql.Connection; public interface IDBConnection {
//初始化连接 void init(); //获取连接 Connection getConnection(); //关闭连接 void close(Connection con); }
package AnLi; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnection { private static String DRIVER="com.mysql.jdbc.Driver"; private static String URL="jdbc:mysql://127.0.0.1:3306/nc"; private static String USER="root"; private static String PASSWORD=""; public Connection getConnection(){ Connection con=null; try { Class.forName(DRIVER); con= DriverManager.getConnection(URL,USER,PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } }
package AnLi; import java.sql.Connection; import java.util.LinkedList; public class MySQLConnectionPool implements IDBConnection{ private static final int minConnection=1; private static final int maxConnection=10; private static final LinkedList<Connection> pools=new LinkedList<Connection>(); private MySQLConnection mySQLConnection=new MySQLConnection(); @Override public void init() { Connection con=null; for (int i=0;i<minConnection;i++){ con=mySQLConnection.getConnection(); pools.add(con); } } @Override public synchronized Connection getConnection() { @SuppressWarnings("ubused") Connection con=null; if(pools.size()==0){ con=mySQLConnection.getConnection(); }else{ con=pools.remove(); } return con; } @Override public synchronized void close(Connection con) { if(pools.size()<maxConnection){ pools.add(con); } } }
package AnLi; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestCustonConnection { public static void main(String[] args) { IDBConnection dbCon=new MySQLConnectionPool(); dbCon.init(); long start=System.currentTimeMillis(); try { for(int i=0;i<100;i++) { Connection con = dbCon.getConnection(); String sql = "select * from employees"; PreparedStatement ps = con.prepareStatement(sql); ResultSet rs=ps.executeQuery(); System.out.println(rs); ps.close(); dbCon.close(con); } } catch (SQLException e) { e.printStackTrace(); } long end =System.currentTimeMillis(); System.out.println(end-start); } }
上面是一个简单的连接池实现。
就介样吧!
心得:
其实不用那么麻烦自己去定义连接池。现在有很多应用成熟的开源的连接池供Java应用程序使用
原文:https://www.cnblogs.com/worth-/p/13639952.html