主要内容:
- 介绍数据库连接池
- 需要的接口和方法
- 实现步骤
一.数据库连接池:
1. 预先向数据库申请多个可用的数据库连接,保存到集合对象中,应用程序每次从集合对象中取出可用的数据库连接,执行数据库操作;操作完成后将连接放回集合对象。实现了数据库连接的复用。
2.数据库连接的建立是整个数据库操作中最耗时的操作,我们只做一次数据库操作就开关一次数据库连接,这样是很影响效率的
3.我们是不是可以这样,每次从某一个缓存的地方获取一个数据库连接,使用完之后再归还到那个缓存的地方,不真正意义上的关闭连接
二.编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:
1.Connection getConnection()
2.Connection getConnection(String username, String password)
三.实现DataSource接口,并实现连接池功能的步骤:
1.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
- 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
- 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。Collection保证将自己返回到LinkedList中是此处编程的难点。
数据库连接池实例:
1 public class SimpleDataSource { 2 private static LinkedList<Connection> connPool=null; 3 4 public static void main(String[] args){ 5 new SimpleDataSource(); 6 7 } 8 9 public SimpleDataSource(){ 10 try{ 11 Class.forName("com.mysql.jdbc.Driver"); 12 connPool=new LinkedList<Connection>(); 13 for(int i=0;i<10;i++){ 14 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?" ,"h3","111111"); 15 connPool.add(conn); 16 System.out.println(conn); 17 } 18 }catch(Exception e){ 19 e.printStackTrace(); 20 } 21 } 22 public Connection getconn(){//从linkedlist 返回一个connection对象 23 return connPool.removeLast(); 24 } 25 26 public void closeConn(Connection conn){//"关闭"数据库连接,不是正真意义上的关闭 27 connPool.add(conn); 28 } 29 30 public void printPoolSize(){ 31 System.out.println("连接池size:"+connPool.size()); 32 } 33 34 public void releasePool()throws Exception{//关闭每一个链接;关闭数据库连接,真正的关闭 35 Iterator it=connPool.iterator(); 36 Connection conn=null; 37 while(it.hasNext()){} 38 conn=(Connection)it.next(); 39 conn.close(); 40 } 41 }
测试数据库连接池:
1 public class TestPool { 2 public static void main(String[] args){ 3 try{ 4 SimpleDataSource sds=new SimpleDataSource(); 5 // sds.releasePool();//关闭数据库连接 6 7 Connection conn=sds.getconn(); 8 System.out.println("connection used.........."+conn); 9 sds.printPoolSize(); 10 11 queryEmp(conn); 12 sds.closeConn(conn); 13 sds.printPoolSize(); 14 System.out.println(""); 15 }catch(Exception e){ 16 e.printStackTrace(); 17 } 18 } 19 20 public static void queryEmp(Connection conn){ 21 try{ 22 String sql="select * from employees"; 23 Statement stmt=conn.createStatement(); 24 ResultSet rs=stmt.executeQuery(sql); 25 while(rs.next()){ 26 System.out.print("工号:"+rs.getInt(1)); 27 System.out.println("工号:"+rs.getString("last_name")); 28 } 29 rs.close(); 30 }catch(Exception e){ 31 e.printStackTrace(); 32 } 33 } 34 }
DBCP数据库连接池:
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("org.gjt.mm.mysql.Driver");
bds.setUrl("jdbc:mysql:///test");
bds.setUsername("root");
bds.setPassword("123456");
bds.setInitialSize(1);
bds.setMaxActive(1);
//bds.setMinIdle(1);
Connection con = bds.getConnection();
System.out.println(con);
con.close();
con = bds.getConnection();
System.out.println(con);
con.close();
C3P0数据库连接池:
ComboPooledDataSource cds = new ComboPooledDataSource();
cds.setDataSourceName("org.gjt.mm.mysql.Driver");
cds.setJdbcUrl("jdbc:mysql:///test");
cds.setUser("root");
cds.setPassword("123456");
cds.setInitialPoolSize(10);
cds.setMaxPoolSize(50);
cds.setMinPoolSize(2);
cds.setMaxStatements(200);
Connection con = cds.getConnection();
System.out.println(con);
con.close();