数据库连接池
什么是连接池
数据库连接池是负责分配、管理、和释放数据库连接的;
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
为什么要用数据库连接池
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出。
如何使用数据库连接池
-
init()初始化资源,
-
获取连接getConnection
-
关闭资源(关闭连接)
1. c3p0
2.dbcp
3.proxool
4.druid (阿里提供的 德鲁伊数据库连接池)
5.jakarata
影响连接池性能的因素
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。
无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1. 最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3. 最小连接数与最大连接数差距
最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
代码展示:
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应用程序使用