`
LiYunpeng
  • 浏览: 961385 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

iBatis 配置自定义C3P0连接池

阅读更多
[转]http://www.blogjava.net/usherlight/archive/2010/02/01/311493.html

IBatis2中提供了3种DataSource的配置:JNDI, Apache DBCP, IBatis自带的SimpleDataSource。但在IBatis3中只提供了两种DataSource: UNPOOLED, POOLED。
如果要实现自定义的DataSource,就需要通过扩展DataSourceFactory。本文就演示一下这个过程。
准备工作:Connection Pool的选择,通过搜索发现目前比较流行的免费数据库连接池主要有3种:Apache DBCP, C3P0, Proxool。
看了一下,Proxool的最新版本是0.9.1(2008-08-23), C3P0的最新版本是0.9.1.2(2007-05-21), DBCP最新版本是1.2.2(2007-04-04)
好像这3个项目都已经挺长时间没有更新了。但是总体评价上C3P0无论从稳定上还是效率上都要好一点。
(具体这3个项目谁更优秀,并不是本文的重点,本文主要是介绍一下如何在IBatis3中自定义数据源)
大致步骤:
1、实现org.apache.ibatis.datasource.DataSourceFactory接口,主要是2个方法
a、public DataSource getDataSource() 如何具体地得到一个数据源
b、public void setProperties(Properties properties) 如何设置数据源的参数属性
2、实现javax.sql.DataSource,这个就是提供给DataSourceFactory的实例
3、在IBatis3中引用新加入的数据源

1. 从代码中可以看出,IBatis3与IBatis2不同,不再通过一个Configuration类来进行数据源属性的设置,而是使用反射机制直接调用数据源的方法来设置参数。
这就要求配置文件中的参数名称必须与数据源类中的方法名匹配.
public class C3p0DataSourceFactory implements DataSourceFactory {

    private DataSource dataSource;

    public C3p0DataSourceFactory() {
        dataSource = new C3p0DataSource();
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setProperties(Properties properties) {
        Properties driverProperties = new Properties();
        MetaObject metaDataSource = MetaObject.forObject(dataSource);
        for (Object key : properties.keySet()) {
            String propertyName = (String) key;
            if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
                String value = properties.getProperty(propertyName);
                driverProperties.setProperty(propertyName
                        .substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
            } else if (metaDataSource.hasSetter(propertyName)) {
                String value = (String) properties.get(propertyName);
                Object convertedValue = convertValue(metaDataSource,
                        propertyName, value);
                metaDataSource.setValue(propertyName, convertedValue);
            } else {
                throw new DataSourceException("Unkown DataSource property: "
                        + propertyName);
            }
        }
        if (driverProperties.size() > 0) {
            metaDataSource.setValue("driverProperties", driverProperties);
        }
    }

    @SuppressWarnings("unchecked")
    private Object convertValue(MetaObject metaDataSource, String propertyName,
            String value) {
        Object convertedValue = value;
        Class targetType = metaDataSource.getSetterType(propertyName);
        if (targetType == Integer.class || targetType == int.class) {
            convertedValue = Integer.valueOf(value);
        } else if (targetType == Long.class || targetType == long.class) {
            convertedValue = Long.valueOf(value);
        } else if (targetType == Boolean.class || targetType == boolean.class) {
            convertedValue = Boolean.valueOf(value);
        }
        return convertedValue;
    }

    private static final String DRIVER_PROPERTY_PREFIX = "driver.";
    private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();

}


2. 数据源类,其中的一堆setter就是用于设置属性的
public class C3p0DataSource implements DataSource {

    private ComboPooledDataSource dataSource;
    public C3p0DataSource() {
        this.dataSource = new ComboPooledDataSource();
    }
    
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public Connection getConnection(String username, String password)
            throws SQLException {
        return dataSource.getConnection(username, password);
    }

    public PrintWriter getLogWriter() throws SQLException {
        return dataSource.getLogWriter();
    }

    public int getLoginTimeout() throws SQLException {
        return dataSource.getLoginTimeout();
    }

    public void setLogWriter(PrintWriter out) throws SQLException {
        dataSource.setLogWriter(out);
    }

    public void setLoginTimeout(int seconds) throws SQLException {
        dataSource.setLoginTimeout(seconds);
    }
    
    
    public synchronized void setDriver(String driver) {
        try {
            dataSource.setDriverClass(driver);
        } catch (Exception e) {
        }
    }
    
    public void setUrl(String url) {
        dataSource.setJdbcUrl(url);
    }
    
    public void setUsername(String username) {
          dataSource.setUser(username);
    }

    public void setPassword(String password) {
        dataSource.setPassword(password);
    }
    
    public void setInitialPoolSize(int initialPoolSize) {
        dataSource.setInitialPoolSize(initialPoolSize);
    }
    
    public void setMaxPoolSize(int maxPoolSize) {
        dataSource.setMaxPoolSize(maxPoolSize);
    }
      
    public void setMinPoolSize(int minPoolSize) {
        dataSource.setMinPoolSize(minPoolSize);
    }
    
    public void setPreferredTestQuery(String preferredTestQuery) {
        dataSource.setPreferredTestQuery(preferredTestQuery);
    }
    
    public void setPoolPingQuery(String poolPingQuery) {
        dataSource.setPreferredTestQuery(poolPingQuery);
    }
}


3. 在配置文件Configuration.xml中,可以先定义数据源的别称,然后就象POOLED和UNPOOLED一样使用别称来引用数据源。
<Configuration>
    ...
    <typeAlias>
        <typeAlias type="com.test.datasource.C3p0DataSourceFactory" alias="C3P0"/>
    </typeAlias>
    <environments default="development"> 
        <environment id="development"> 
            <transactionManager type="JDBC"/> 
            <dataSource type="C3P0"> 
                <property name="driver" value="${jdbc.driver}"/> 
                <property name="url" value="${jdbc.url}"/> 
                <property name="username" value="${jdbc.username}"/> 
                <property name="password" value="${jdbc.password}"/>
                <property name="poolPingQuery" value="${pingquery}"/>            
            </dataSource> 
        </environment> 
    </environments> 
    ...
<Configuration>



分享到:
评论
1 楼 Purking 2010-11-07  
还可以直接继承 UnpooledDataSourceFactory
1. public class C3p0 extends UnpooledDataSourceFactory;
   (com.package.c3p0_ibatis)
2. 配置文件中设置
   
environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="com.package..C3p0"> <!-- 配置全名 -->
        <!-- 连接池设置由C3p0.properties自己决定 -->
      </dataSource>
    </environment>
  </environments>

3. 将 c3p0.properties 文件放入 classpath 中

这样省去很多代码,还可以完全设置 c3p0 的各个配置属性,简单很多,试一下?

相关推荐

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

    标题 "ibatis-2.3.0.677增加对c3p0连接池的支持" 描述了MyBatis框架的一个更新,其中包含了对c3p0数据库连接池的集成。MyBatis是一个轻量级的Java持久层框架,它允许开发者将SQL语句直接嵌入到Java代码中,提供了比...

    ibatis配置详解

    1. **数据源配置**:Ibatis允许开发者配置不同类型的数据库连接池,如C3P0、Druid和HikariCP等。通过`&lt;dataSource&gt;`标签,你可以指定数据源的类型、驱动类、数据库连接信息等。 2. **事务管理器**:在`...

    Spring 3.0 整合 iBatis 3 Beta10 配置

    使用C3P0连接池配置,如示例所示,通过属性占位符 `${jdbc.*}` 来引用`.properties`文件中的值: ```xml &lt;!-- C3P0 数据源配置 --&gt; &lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&gt;...

    扩展 iBatis 以透明支持多种数据库

    针对不同数据库,可能需要配置不同的连接池实现,如 HikariCP、C3P0 或者 DBCP。 5. **驱动程序管理**:在项目中,需要为每种数据库添加对应的 JDBC 驱动依赖,并在配置中指定正确的驱动类名。 6. **事务管理**:...

    WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6+iBatis2.3.4

    - `c3p0-0.9.1.2.jar`: c3p0数据库连接池,用于管理数据库连接 - `ojdbc14-9.0.2.0.0.jar`: Oracle JDBC驱动,如果项目使用Oracle数据库 - `dbcore.jar`: 这是个人开发的库,对理解本次集成不重要 5. **数据库...

    Ibatis学习笔记,文档,资源6合1

    同时,Ibatis还支持连接池,如Druid或C3P0,以提高数据库连接的复用率,减少系统资源的消耗。 Ibatis的注解方式是另一种简化配置的方法,开发者可以直接在Mapper接口的方法上添加@Select、@Insert、@Update和@...

    自己总结的IBATIS资料

    可以使用不同的数据源实现,如DBCP、C3P0等。 6. **元素** - `&lt;sqlMap&gt;`元素用于引用SQL映射文件,这些文件包含具体的SQL语句和结果映射规则。 #### 四、SQLMap XML映射文件 1. **MappedStatements** - Mapped...

    框架面试笔试问答题.docx

    - **配置数据源**:通常使用Druid或C3P0等数据连接池。 - **配置SqlSessionFactory**:通过SqlSessionFactoryBean来配置,指定数据源和Mapper接口的位置。 - **编写Mapper接口**:定义SQL语句的接口方法,由MyBatis...

    java面试知识

    - **常见实现**:C3P0、DBCP、HikariCP等。 ##### mysql的数据库导入导出 - **导出**:使用mysqldump命令。 - **导入**:使用mysql命令或直接导入SQL文件。 ##### jdbc分段批量提交的时候出现异常怎么处理? - ...

Global site tag (gtag.js) - Google Analytics