zoukankan      html  css  js  c++  java
  • 三个目前比较常见的连接池的简单运用

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

      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

  • 相关阅读:
    语法上的小trick
    [算法模版]斜率优化
    CF886E Maximum Element
    【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)
    【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)
    【poj 2478】Farey Sequence(数论--欧拉函数 找规律求前缀和)
    【poj 1284】Primitive Roots(数论--欧拉函数 求原根个数){费马小定理、欧拉定理}
    【poj 2407】Relatives(数论--欧拉函数 模版题)
    【bzoj 2038】 [2009国家集训队]小Z的袜子(算法效率--莫队分块算法 模版题)
    【uva 1312】Cricket Field(算法效率--技巧枚举)
  • 原文地址:https://www.cnblogs.com/tzpRoomForLearning/p/7703861.html
Copyright © 2011-2022 走看看