zoukankan      html  css  js  c++  java
  • ibatis使用proxool连接池

    ibatis本身并不直接支持proxool的数据源连接,我们可以通过以下方法实现:
    第一:采用spring将ibatis与proxool进行整合,利用spring将proxool数据源注入到sqlmapclient中去,具体配置可在网上找spring+ibatis整合的例子。
    第二种方式,不依赖spring完全独立,首先我们要自定义一个DataSourceFactory类,这个类必须实现com.ibatis.sqlmap.engine.datasource.DataSourceFactory接口

    代码实现:

    代码
    package mycom.util.db;

    import java.util.Map;   

    import javax.sql.DataSource;   
      
    import org.logicalcobwebs.proxool.ProxoolDataSource;   
      
    import com.ibatis.sqlmap.engine.datasource.DataSourceFactory;  

    public class ProxoolDataSourceFactory implements DataSourceFactory {

        
    private ProxoolDataSource dataSource;    
         
        
    public DataSource getDataSource() {   
            
    return dataSource;   
        }   
      
        
    /**  
         * 此方法中实现对ProxoolDataSource类中相关属性的设置  
         * house-keeping-sleep-time
         * 线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
         * house-keeping-test-sql
         * 如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
         * maximum-active-time
         * 最大线程活动时间。
         * maximum-connection-count
         * 数据库最大连接数(默认值为15)
         * maximum-connection-count
         * 一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒
         * overload-without-refusal-lifetime
         * 这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
         
    */  
        
    public void initialize(Map map) {   
            dataSource 
    = new ProxoolDataSource();   
            dataSource.setDriver((String)map.get(
    "driver"));   
            dataSource.setDriverUrl((String)map.get(
    "driverUrl"));   
            dataSource.setUser((String)map.get(
    "user"));   
            dataSource.setPassword((String)map.get(
    "password"));   
            dataSource.setAlias(
    "alias"); 
              
            
    //线程保持休眠时间,house keeper负责检查所有连接的状态,并测试是否需要销毁或者创建,默认时间为30秒
            if(map.containsKey("house-keeping-sleep-time")){
                dataSource.setHouseKeepingSleepTime(Integer.parseInt(map.get(
    "house-keeping-sleep-time").toString()));
            }
            
    //如果house keep 线程发现空闲的连接,他会测试使用这个sql进行测试,这个语句应该快速的被执行。像查询日期的sql语句。
            if(map.containsKey("house-keeping-test-sql")){
                dataSource.setHouseKeepingTestSql(map.get(
    "house-keeping-test-sql").toString());
            }
            
    //最大线程活动时间。
            
    //如果housekeeper 遇到一个线程活动时间超过定义的时间,将会终止这个线程。
            
    //所以你需要设置这个时间大于预计最慢响应的时间(默认时间是5分钟)。
            if(map.containsKey("maximum-active-time")){
                dataSource.setMaximumActiveTime(Integer.parseInt(map.get(
    "maximum-active-time").toString()));
            }
            
    //数据库最大连接数(默认值为15)
            if(map.containsKey("maximum-connection-count")){
                dataSource.setMaximumConnectionCount(Integer.parseInt(map.get(
    "maximum-connection-count").toString()));
            }
            
    //一个连接存在的最长保持活动的时间。默认值是4小时,单位是毫秒。
            if(map.containsKey("maximum-connection-lifetime")){
                dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get(
    "maximum-connection-lifetime").toString()));
            }
            
    //最小连接保持打开的个数,不管是否需要,默认值是5个。
            if(map.containsKey("minimum-connection-count")){
                dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get(
    "minimum-connection-count").toString()));
            }
            
    //这个帮助我们确定连接池的状态。如果在这个时间阀值内(单位为毫秒)拒绝了一个连接,就认为是过载了。默认时间60秒。
            if(map.containsKey("overload-without-refusal-lifetime")){
                dataSource.setMaximumConnectionLifetime(Integer.parseInt(map.get(
    "overload-without-refusal-lifetime").toString()));
            }      
        }   
    }


    配置sqlmap.xml文件

    代码
     <dataSource type="mycom.util.db.ProxoolDataSourceFactory">  
          
    <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>  
          
    <property name="driverUrl" value="jdbc:sqlserver://localhost:1433;databaseName=mydb;"/>  
          
    <property name="user" value="sa"/>  
          
    <property name="password" value="sasa"/>  
          
    <property name="maximum-connection-count" value="40"/>
          
    <property name="overload-without-refusal-lifetime" value="60"/>
          
    <property name="house-keeping-test-sql" value="select getdate()"/>
          
        
    </dataSource>  

    附proxool的下载地址:

    http://proxool.sourceforge.net/

  • 相关阅读:
    Javescript基础api实现原理
    React Fiber
    ASP.NET中Form验证登录后反复跳转回登录页面的问题
    跨域部署Silverlight时需要注意的问题
    Windows 8 x64+Ruby 2上安装Sqlite3方法
    .NET 项目在源码控制中程序集的引用问题
    [EntLib]解决The type or namespace name 'Data' does not exist in the namespace 'Microsoft.Practices.EnterpriseLibrary' 的错误
    ASP.NET MVC Url中参数过长引发的问题
    Windows 8 x64 QQ2012/2013beta无法启动屌丝解决方法
    TechEd 2010参会小记
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/1864443.html
Copyright © 2011-2022 走看看