三个目前比较常见的连接池的简单运用

 三个目前比较常见的连接池的简单运用

  c3p0:

    目前在市面上c3p0可以说已经占据了连接池的大头,很多的框架都在使用c3p0来作为连接数据库的一个连接池。

    那么我们如何使用c3p0来获取连接呢,

    c3p0给我们提供了三种方式 

      1、通过setXXX()的方式来设置属性,很简单,但这样的话难免有着硬编码的问题(spring框架可以在spring配置文件中通过依赖注入的方式来设置属性)

      2、通过properties属性文件来进行配置,这种就是直接创建一个c3p0.properties文件并设置相应属性就可以了,c3p0可以进行自动解析(这样在修改连接属性时就需要修改源代码)

      3、通过xml文件配置信息, 与第二点类似,另外说一下,xml配置文件似乎用的更多。

      详情可以参照http:// blog.csdn.net/u012506661/article/details/53548083,写得就非常详细

    那么我们接下来就附上第一种方式的代码 ,这是最简单的使用,不需要配置就可以了,同我上一次发的文章一样,我也已经把他封装到一个DBUtil工具类中了,

    步骤1.

      导入jar包   

    步骤2、实例化一个ComboPooledDataSource对象,并设置属性(我是自己创建一个properties文件进行配置)

    步骤3、调用getConnection()获取连接进行操作 

  1 package com.c3p0;
  2 
  3 import java.beans.PropertyVetoException;
  4 import java.sql.Connection;
  5 import java.sql.DriverManager;
  6 import java.sql.PreparedStatement;
  7 import java.sql.ResultSet;
  8 import java.sql.SQLException;
  9 import java.util.ResourceBundle;
 10 
 11 import com.mchange.v2.c3p0.ComboPooledDataSource;
 12 
 13 
 14 public class DButil {
 15     private static ComboPooledDataSource ds = null;
 16     ResultSet rs = null;
 17     Connection con=null;
 18     PreparedStatement stmt=null;
 19     static{
 20         ds = new ComboPooledDataSource();
 21         try {
 22             ds.setDriverClass("com.mysql.jdbc.Driver");
 23         } catch (PropertyVetoException e) {
 24             // TODO Auto-generated catch block
 25             e.printStackTrace();
 26         }
 27         ResourceBundle rb = ResourceBundle.getBundle("dbcp");
 28         ds.setJdbcUrl(rb.getString("url"));
 29         ds.setUser(rb.getString("name"));
 30         ds.setPassword(rb.getString("password"));
 31         ds.setMaxPoolSize(Integer.parseInt(rb.getString("maxActive")));//设置最大连接数
 32         ds.setMaxIdleTime(Integer.parseInt(rb.getString("maxWait")));//设置等待时间
 33         ds.setInitialPoolSize(Integer.parseInt(rb.getString("maxIdle")));//设置最大空闲连接数
 34     }
 35     //用构造方法加载驱动
 36     public DButil(){
 37         
 38     }
 39     
 40     //创建链接符对象
 41     public  void  conManager()
 42     {
 43         try {
 44             con=ds.getConnection();
 45         } catch (SQLException e) {
 46             // TODO Auto-generated catch block
 47             e.printStackTrace();
 48         }
 49     }
 50     //创建方法用于关闭数据库
 51     public void closeFunction(ResultSet rs){
 52         try{
 53             //如果三个值不为空 就关闭
 54             if(rs!=null){
 55                 rs.close();
 56             }
 57             if(con!=null){
 58                 ds.close();
 59             }
 60             if(stmt!=null){
 61                 stmt.close();
 62             }
 63         }catch(Exception e){
 64             e.printStackTrace();
 65         }
 66     }
 67     /**
 68      * 封装工具类的方法(用于增删改)
 69      * @param sql
 70      * @return
 71      */
 72     public  int execUpdate(String sql,Object[] o){
 73         int result=0;
 74         //创建Conn类型的变量
 75         try{
 76             conManager();
 77             //创建数据库操作对象
 78             
 79             stmt=con.prepareStatement(sql);
 80             if(o!=null){
 81                 for(int i=0;i<o.length;i++){
 82                     stmt.setObject(i+1, o[i]);
 83                 }
 84             }
 85             //用result保存数据库执行
 86              result=stmt.executeUpdate();
 87         }catch(Exception e){
 88             e.printStackTrace();
 89         }
 90         finally{
 91             closeFunction(null);
 92         }
 93         
 94         
 95         return result;
 96     }
 97     /**
 98      * 封装工具类用于查询
 99      */
100     public  ResultSet connectionSelect(String sql,Object[] o){
101         try{
102             //写入驱动
103             conManager();
104             //创建数据库操作对象
105             stmt=con.prepareStatement(sql);
106             if(o!=null){
107                 for(int i=0;i<o.length;i++){
108                     stmt.setObject(i+1, o[i]);
109                 }
110             }
111             //用rs保存数据库执行
112             rs=stmt.executeQuery();
113             
114             
115         }catch(Exception e){
116             e.printStackTrace();
117         }
118         return rs;
119     }
120 }
View Code
package com.c3p0;

import java.sql.ResultSet;

import org.junit.Test;


public class Demo {
	@Test
	public void run() throws Exception{
		DButil db = new DButil();
		ResultSet rs = db.connectionSelect("select * from SECURITY",null);
		while(rs.next()){
			System.out.println(rs.getString(1)+"	"+rs.getString(2));
		}
	}
}

  

  DBCP的使用

    同样有三步

    1、导入架包

    2、实例 化 一个BasicDataSource类,设置属性

    3、获取连接进行操作

       

 1 @Test
 2     public void demo() throws Exception{
 3         //创建读取文件的资源对象
 4         ResourceBundle rb = ResourceBundle.getBundle("dbcp");
 5         //创建基础数据源
 6         BasicDataSource bds = new BasicDataSource();
 7         //设置参数
 8         bds.setMaxActive(Integer.parseInt(rb.getString("maxActive")));
 9         bds.setMaxIdle(Integer.parseInt(rb.getString("maxIdle")));
10         bds.setMaxWait(Integer.parseInt(rb.getString("maxWait")));
11         bds.setUsername(rb.getString("name"));
12         bds.setPassword(rb.getString("password"));
13         bds.setDriverClassName(rb.getString("driverClassName"));
14         bds.setUrl(rb.getString("url"));
15         
16             Connection conn = bds.getConnection();
17             PreparedStatement pst = conn.prepareStatement("select * from SECURITY");
18             //执行sql
19             ResultSet rs = pst.executeQuery();
20             //遍历
21             while(rs.next()){
22                 System.out.println(rs.getObject(1)+"	"+rs.getObject(2));
23             }    
24         rs.close();
25         pst.close();
26         conn.close();
27     }
View Code

  值得说下的是,druid这款连接池,目前据说是比以往任何一款连接池的性能都要强,也许过不了多久,连接池的市场可能druid要独占鳌头了,所以这个比较重要 

  druid本身也支持三种配置连接属性的方式 ,

  即 set方法设置 、properties文件配置、还有xml配置文件这三种,由于这里只是做一个简单的使用,所以我使用了第一种方式

  步骤如下

    1、导入jar包

    2、实例化DruidDataSource,并通过set方法设置属性

    3、获取连接

    4、进行操作,

    5、直接调用连接的close就可以归还连接了

  工具类的代码

public class DButil {
    private static DruidDataSource ds = null;
    ResultSet rs = null;
    Connection con=null;
    PreparedStatement stmt=null;
    static{
        //读取配置文件信息
        ResourceBundle rb = ResourceBundle.getBundle("dbcp");
        ds = new DruidDataSource();
        //设置ds连接池的参数
        ds.setDriverClassName(rb.getString("url"));
        ds.setUsername(rb.getString("name"));
        ds.setPassword(rb.getString("password"));
        ds.setUrl(rb.getString("url"));
        ds.setInitialSize(Integer.parseInt(rb.getString("maxActive")));
        ds.setMinIdle(Integer.parseInt(rb.getString("maxWait")));
        ds.setMaxActive(Integer.parseInt(rb.getString("maxIdle"))); 
    }
    //用构造方法加载驱动
    public DButil(){
        
    }
    
    //创建链接符对象
    public  void  conManager()
    {
        try {
            con=ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //创建方法用于关闭数据库
    public void closeFunction(ResultSet rs){
        try{
            //如果三个值不为空 就关闭
            if(rs!=null){
                rs.close();
            }
            if(con!=null){
                con.close();
            }
            if(stmt!=null){
                stmt.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 封装工具类的方法(用于增删改)
     * @param sql
     * @return
     */
    public  int execUpdate(String sql,Object[] o){
        int result=0;
        //创建Conn类型的变量
        try{
            conManager();
            //创建数据库操作对象
            
            stmt=con.prepareStatement(sql);
            if(o!=null){
                for(int i=0;i<o.length;i++){
                    stmt.setObject(i+1, o[i]);
                }
            }
            //用result保存数据库执行
             result=stmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }
        finally{
            closeFunction(null);
        }
        
        
        return result;
    }
    /**
     * 封装工具类用于查询
     */
    public  ResultSet connectionSelect(String sql,Object[] o){
        try{
            //写入驱动
            conManager();
            //创建数据库操作对象
            stmt=con.prepareStatement(sql);
            if(o!=null){
                for(int i=0;i<o.length;i++){
                    stmt.setObject(i+1, o[i]);
                }
            }
            //用rs保存数据库执行
            rs=stmt.executeQuery();
            
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return rs;
    }
}
View Code

测试的代码

@Test
    public void run() throws Exception{
        DButil db = new DButil();
        ResultSet rs = db.connectionSelect("select * from user",null);
        while(rs.next()){
            System.out.println(rs.getString(1)+"	"+rs.getString(2)+"	"+rs.getString(3)+"	");
        }
    }
View Code

  总结一下,如昨天说的一样,这三个连接池都要求要实例化一个实现了DataSource接口的实现类进行操作,同时他们对connection即获取的连接的close方法进行了增强,以达到关闭连接时

    不是关闭与数据库的连接而是归还到连接池中,说得不是很详细,还需要多多学习

     详细可看http://www.cnblogs.com/hafiz/p/5879356.html

分享一个文章,写得很可以,比我的详细很多

http://www.cnblogs.com/shellway/p/3938554.html

原文地址:https://www.cnblogs.com/tzpRoomForLearning/p/7703861.html