首页 > 技术文章 > JDBC连接池

wuziyue 2015-10-08 18:12 原文

主要内容:

  • 介绍数据库连接池
  • 需要的接口和方法
  • 实现步骤

一.数据库连接池:

     1. 预先向数据库申请多个可用的数据库连接,保存到集合对象中,应用程序每次从集合对象中取出可用的数据库连接,执行数据库操作;操作完成后将连接放回集合对象。实现了数据库连接的复用。

     2.数据库连接的建立是整个数据库操作中最耗时的操作,我们只做一次数据库操作就开关一次数据库连接,这样是很影响效率的
     3.我们是不是可以这样,每次从某一个缓存的地方获取一个数据库连接,使用完之后再归还到那个缓存的地方,不真正意义上的关闭连接

二.编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

     1.Connection getConnection()

     2.Connection getConnection(String username, String password)

三.实现DataSource接口,并实现连接池功能的步骤:

     1.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。

  1. 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。

  2. 当用户使用完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();

推荐阅读