`
Sev7en_jun
  • 浏览: 1234654 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
84184fc0-d0b6-3f7f-a3f0-4202acb3caf5
Apache CXF使用s...
浏览量:112055
社区版块
存档分类
最新评论

ibatis-2.3.0.677增加对c3p0连接池的支持

 
阅读更多

 

1,在com.ibatis.sqlmap.engine.datasource包新增类C3P0DataSourceFactory:

 

package com.ibatis.sqlmap.engine.datasource;

import com.ibatis.common.jdbc.C3P0Configuration;
import java.util.Map;
import javax.sql.DataSource;

public class C3P0DataSourceFactory
  implements DataSourceFactory
{
  private DataSource dataSource;

  public void initialize(Map map)
  {
    C3P0Configuration c3p0 = new C3P0Configuration(map);
    this.dataSource = c3p0.getDataSource();
  }

  public DataSource getDataSource() {
    return this.dataSource;
  }
}

 

 

2,在com.ibatis.common.jdbc包新增类C3P0Configuration ,主要作用是加载c3p0的配置文件信息: 

 

package com.ibatis.common.jdbc;

import com.ibatis.common.beans.Probe;
import com.ibatis.common.beans.ProbeFactory;
import com.ibatis.common.exception.NestedRuntimeException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class C3P0Configuration
{
  private static final Probe PROBE = ProbeFactory.getProbe();
  private static final String ADD_DRIVER_PROPS_PREFIX = "Driver.";
  private static final int ADD_DRIVER_PROPS_PREFIX_LENGTH = "Driver.".length();
  private DataSource dataSource;

  public C3P0Configuration(Map properties)
  {
    try
    {
      this.dataSource = legacyC3P0Configuration(properties);
      if (this.dataSource == null)
        this.dataSource = newDbcpConfiguration(properties);
    } catch (Exception e) {
      throw new NestedRuntimeException("Error initializing C3P0DataSourceFactory.  Cause: " + e, e);
    }
  }

  public DataSource getDataSource() {
    return this.dataSource;
  }

  private BasicDataSource newDbcpConfiguration(Map map) {
    BasicDataSource basicDataSource = new BasicDataSource();
    Iterator props = map.keySet().iterator();
    while (props.hasNext()) {
      String propertyName = (String)props.next();
      if (propertyName.startsWith("Driver.")) {
        String value = (String)map.get(propertyName);
        basicDataSource.addConnectionProperty(propertyName.substring(ADD_DRIVER_PROPS_PREFIX_LENGTH), value);
      } else if (PROBE.hasWritableProperty(basicDataSource, propertyName)) {
        String value = (String)map.get(propertyName);
        Object convertedValue = convertValue(basicDataSource, propertyName, value);
        PROBE.setObject(basicDataSource, propertyName, convertedValue);
      }
    }
    return basicDataSource;
  }

  private Object convertValue(Object object, String propertyName, String value) {
    Object convertedValue = value;
    Class targetType = PROBE.getPropertyTypeForSetter(object, propertyName);
    if ((targetType == Integer.class) || (targetType == Integer.TYPE))
      convertedValue = Integer.valueOf(value);
    else if ((targetType == Long.class) || (targetType == Long.TYPE))
      convertedValue = Long.valueOf(value);
    else if ((targetType == Boolean.class) || (targetType == Boolean.TYPE)) {
      convertedValue = Boolean.valueOf(value);
    }
    return convertedValue;
  }

  private ComboPooledDataSource legacyC3P0Configuration(Map map) throws Exception {
    ComboPooledDataSource basicDataSource = null;
    if (map.containsKey("driver")) {
      basicDataSource = new ComboPooledDataSource();
      String driver = (String)map.get("driver");
      String url = (String)map.get("url");
      String username = (String)map.get("username");
      String password = (String)map.get("password");

      String initialPoolSize = (String)map.get("initialPoolSize");
      String maxPoolSize = (String)map.get("maxPoolSize");
      String minPoolSize = (String)map.get("minPoolSize");
      String acquireIncrement = (String)map.get("acquireIncrement");
      String maxIdleTime = (String)map.get("maxIdleTime");
      String maxIdleTimeExcessConnections = (String)map.get("maxIdleTimeExcessConnections");
      String maxConnectionAge = (String)map.get("maxConnectionAge");
      String maxStatements = (String)map.get("maxStatements");
      String maxStatementsPerConnection = (String)map.get("maxStatementsPerConnection");
      String numHelperThreads = (String)map.get("numHelperThreads");
      String automaticTestTable = (String)map.get("automaticTestTable");
      String preferredTestQuery = (String)map.get("preferredTestQuery");
      String checkoutTimeout = (String)map.get("checkoutTimeout");
      String idleConnectionTestPeriod = (String)map.get("idleConnectionTestPeriod");
      String acquireRetryDelay = (String)map.get("acquireRetryDelay");
      String acquireRetryAttempts = (String)map.get("acquireRetryAttempts");
      String testConnectionOnCheckin = (String)map.get("testConnectionOnCheckin");

      basicDataSource.setDriverClass(driver);
      basicDataSource.setJdbcUrl(url);
      basicDataSource.setUser(username);
      basicDataSource.setPassword(password);

      if (notEmpty(automaticTestTable)) {
        basicDataSource.setAutomaticTestTable(automaticTestTable);
      }
      if (notEmpty(acquireRetryDelay)) {
        basicDataSource.setAcquireRetryDelay(Integer.valueOf(acquireRetryDelay).intValue());
      }
      if (notEmpty(testConnectionOnCheckin)) {
        basicDataSource.setTestConnectionOnCheckin(Boolean.valueOf(testConnectionOnCheckin).booleanValue());
      }
      if (notEmpty(acquireRetryAttempts)) {
        basicDataSource.setAcquireRetryAttempts(Integer.valueOf(acquireRetryAttempts).intValue());
      }
      if (notEmpty(preferredTestQuery)) {
        basicDataSource.setPreferredTestQuery(preferredTestQuery);
      }
      if (notEmpty(checkoutTimeout)) {
        basicDataSource.setCheckoutTimeout(Integer.valueOf(checkoutTimeout).intValue());
      }
      if (notEmpty(checkoutTimeout)) {
        basicDataSource.setCheckoutTimeout(Integer.valueOf(checkoutTimeout).intValue());
      }
      if (notEmpty(idleConnectionTestPeriod)) {
        basicDataSource.setIdleConnectionTestPeriod(Integer.valueOf(idleConnectionTestPeriod).intValue());
      }
      if (notEmpty(initialPoolSize)) {
        basicDataSource.setInitialPoolSize(Integer.parseInt(initialPoolSize));
      }
      if (notEmpty(maxPoolSize)) {
        basicDataSource.setMaxPoolSize(Integer.parseInt(maxPoolSize));
      }
      if (notEmpty(minPoolSize)) {
        basicDataSource.setMinPoolSize(Integer.parseInt(minPoolSize));
      }
      if (notEmpty(acquireIncrement)) {
        basicDataSource.setAcquireIncrement(Integer.parseInt(acquireIncrement));
      }
      if (notEmpty(maxIdleTime)) {
        basicDataSource.setMaxIdleTime(Integer.parseInt(maxIdleTime));
      }
      if (notEmpty(maxIdleTimeExcessConnections)) {
        basicDataSource.setMaxIdleTimeExcessConnections(Integer.parseInt(maxIdleTimeExcessConnections));
      }
      if (notEmpty(maxConnectionAge)) {
        basicDataSource.setMaxConnectionAge(Integer.parseInt(maxConnectionAge));
      }
      if (notEmpty(maxStatements)) {
        basicDataSource.setMaxStatements(Integer.parseInt(maxStatements));
      }
      if (notEmpty(maxStatementsPerConnection)) {
        basicDataSource.setMaxStatementsPerConnection(Integer.parseInt(maxStatementsPerConnection));
      }
      if (notEmpty(numHelperThreads)) {
        basicDataSource.setNumHelperThreads(Integer.parseInt(numHelperThreads));
      }
    }
    return basicDataSource;
  }

  private boolean notEmpty(String s) {
    return (s != null) && (s.length() > 0);
  }
}

 

 

 3,在com.ibatis.sqlmap.engine.builder.xml下SqlMapConfigParser类的registerDefaultTypeAliases方法中添加如下代码:

this.vars.typeHandlerFactory.putTypeAlias("C3P0", C3P0DataSourceFactory.class.getName());

 

 

 4,在com.ibatis.common.exception下新增异常处理类,如果没有此包,可以新建,代码见附件Exception.rar(NestedException.class , NestedRuntimeException.class)

 

5, ibatis配置文件如下,注意property中的name必须和下面一致:

<transactionManager type="JDBC">
  <dataSource type="C3P0">
   <property name="driver" value="${driver}" />
   <property name="url" value="${url}" />
   <property name="username" value="${username}" />
   <property name="password" value="${password}" />
   <property name="initialPoolSize" value="10" />
   <property name="maxPoolSize" value="100" />
   <property name="minPoolSize" value="10" />
   <property name="acquireIncrement" value="5" />
   <property name="maxIdleTime" value="3600" />
   <property name="maxIdleTimeExcessConnections" value="1200" />
   <property name="maxConnectionAge" value="27000" />
   <property name="maxStatements" value="200" />
   <property name="maxStatementsPerConnection" value="50" />
   <property name="numHelperThreads" value="10" />
   <property name="idleConnectionTestPeriod"  value="5" />
   <property name="checkoutTimeout" value="30000"/>
   <property name="preferredTestQuery" value="select 1"/>
   <property name="acquireRetryDelay" value="1000"/>
   <property name="acquireRetryAttempts" value="1"/>
   <property name="testConnectionOnCheckin" value="true"/>
   <property name="automaticTestTable" value="c3p0Test"/>
  </dataSource>
 </transactionManager>

 配置中只支持如上属性配置,如果需要加额外属性请在第二步的C3P0Configuration类的legacyC3P0Configuration方法中增加

附件ibatis-2.3.0.677.jar包是已扩展,无需修改

增加c3p0支持包:c3p0-0.9.1.2.jar

 

 

 

PS: 以上只限ibatis-2.3.0.677版本,其他版本按照此方式未必行得通

以下亲测可用

 

PS: 以下只限ibatis-2.3.0.677版本

分享到:
评论
1 楼 zhh309 2014-11-12  

学习了。

相关推荐

    ibatisv230677.zip

    本压缩包"ibatisv230677.zip"包含了Ibatis 2.3.0.677版本的jar包和一份使用说明,对于正在学习Java、特别是Spring+Ibatis集成的开发者来说,这是一个非常有价值的资源。 Ibatis 的核心理念是将SQL语句写在XML配置...

    人力资源管理(基于ssh的j2ee项目)附带lib包

    - `ibatis-2.3.0.677.jar`:MyBatis的早期版本,也可能用于数据库操作,与Hibernate共同使用或替换部分功能。 5. **功能模块**: - **人力资源档案管理**:包括员工基本信息录入、修改、查询等操作。 - **调动...

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    并联型APF有源电力滤波器Matlab Simulink仿真:dq与αβ坐标系下的谐波无功检测与PI控制及SVPWM调制

    内容概要:本文详细介绍了并联型有源电力滤波器(APF)在Matlab/Simulink环境下的仿真研究。主要内容涵盖三个关键技术点:一是dq与αβ坐标系下的谐波和无功检测,利用dq变换和FBD技术实现实时检测;二是两相旋转坐标系(dq)与两相静止坐标系(αβ)下的PI控制,通过调整比例和积分环节实现精准控制;三是SVPWM调制方式的应用,通过优化开关时序提升系统效率和性能。文中还提供了详细的仿真介绍文档,包括模型搭建、参数设定以及结果分析。 适合人群:从事电力电子、自动化控制领域的研究人员和技术人员,尤其是对电力滤波器仿真感兴趣的读者。 使用场景及目标:适用于需要深入了解并联型APF工作原理和实现方式的研究人员,旨在通过仿真工具掌握谐波和无功检测、PI控制及SVPWM调制的具体应用。 其他说明:本文不仅提供了理论知识,还结合了实际操作步骤,使读者能够通过仿真模型加深对APF的理解。

    Arduino KEY实验例程【正点原子ESP32S3】

    Arduino KEY实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    .archivetempdebug.zip

    .archivetempdebug.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    两极式单相光伏并网系统的Boost电路与桥式逆变仿真及优化方法

    内容概要:本文详细介绍了两极式单相光伏并网系统的组成及其仿真优化方法。前级采用Boost电路结合扰动观察法(P&O)进行最大功率点跟踪(MPPT),将光伏板输出电压提升至并网所需水平;后级利用全桥逆变加L型滤波以及电压外环电流内环控制,确保并网电流与电网电压同频同相,实现高效稳定的并网传输。文中还提供了具体的仿真技巧,如开关频率设置、L滤波参数计算和并网瞬间软启动等,最终实现了98.2%的系统效率和低于0.39%的总谐波失真率(THD)。 适合人群:从事光伏并网系统研究、设计和开发的技术人员,特别是对Boost电路、MPPT算法、逆变技术和双环控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解两极式单相光伏并网系统的工作原理和技术细节的研究人员和工程师。目标是在实际项目中应用这些理论和技术,提高光伏并网系统的效率和稳定性。 其他说明:文中提供的仿真技巧和伪代码有助于读者更好地理解和实现相关算法,在实践中不断优化系统性能。同时,注意电网电压跌落时快速切换到孤岛模式的需求,确保系统的安全性和可靠性。

    昭通乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    岩土工程中随机裂隙网络注浆模型及其应用:不同压力下注浆效果的研究

    内容概要:本文详细介绍了三种注浆模型——随机裂隙网络注浆模型、基于两相达西定律的注浆模型、基于层流和水平集的注浆扩散模型。首先,随机裂隙网络注浆模型基于地质学原理,模拟裂隙网络发育的实际地质情况,在不同注浆压力下进行注浆作业,以增强地基稳定性和提高承载能力。其次,基于两相达西定律的注浆模型利用数学公式模拟裂隙网络中的流体输送过程,适用于裂隙网络地质条件下的注浆效果分析。最后,基于层流和水平集的注浆扩散模型通过引入层流特性和水平集方法,更准确地模拟注浆过程中的扩散过程。文中还讨论了不同注浆压力对注浆效果的影响,并提出了优化建议。 适合人群:从事岩土工程、地基加固等相关领域的工程师和技术人员。 使用场景及目标:①帮助工程师选择合适的注浆模型和注浆压力;②为实际工程项目提供理论支持和技术指导;③提升地基加固的效果和效率。 其他说明:文章强调了在实际应用中需要结合地质条件、裂隙网络特点等因素进行综合分析,以达到最佳注浆效果。同时,鼓励不断创新注浆工艺和方法,以满足日益增长的地基加固需求。

    COMSOL Multiphysics 5.5与6.0版本Ar棒板粗通道流注放电仿真的电子特性分析

    内容概要:本文详细比较了COMSOL Multiphysics软件5.5和6.0版本在模拟Ar棒板粗通道流注放电现象方面的异同。重点探讨了不同版本在处理电子密度、电子温度、电场强度以及三维视图等方面的优缺点。文中不仅介绍了各版本特有的操作方式和技术特点,还提供了具体的代码实例来展示如何进行精确的仿真设置。此外,文章还讨论了网格划分、三维数据提取和电场强度后处理等方面的技术难点及其解决方案。 适合人群:从事等离子体物理研究的专业人士,尤其是熟悉COMSOL Multiphysics软件并希望深入了解其最新特性的研究人员。 使用场景及目标:帮助用户选择合适的COMSOL版本进行高效、精确的等离子体仿真研究,特别是在处理复杂的Ar棒板粗通道流注放电现象时提供指导。 其他说明:文章强调了在实际应用中,选择COMSOL版本不仅要考虑便捷性和视觉效果,还需兼顾仿真精度和可控性。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

Global site tag (gtag.js) - Google Analytics