【问题标题】:Enabling connection pooling with HSQLDB and Spring embedded database使用 HSQLDB 和 Spring 嵌入式数据库启用连接池
【发布时间】:2014-07-22 19:38:36
【问题描述】:

最近,我一直在尝试为我们的一个在生产中使用 Oracle DB 的应用程序实现一个基于 HSQLDB 的内存数据库。该应用程序使用弹簧框架。但是,当我们使用现有的 SQL DDL 语句(Oracle 查询)时,我必须以编程方式实现数据源 bean,因此必须以编程方式删除命名空间等结构,然后才能在 HSQLDB 上运行。

我使用 EmbeddedDatabaseBuilder(ResourceLoader) 初始化数据库。

现在我的问题是我现在想使用 c3p0 来添加连接池。 通常我会使用

<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="HSQLDB driver path" /> (this is just for representation)
    <property name="jdbcUrl" value="${xxx.jdbcUrl}" />
    <property name="user" value="${xxx.username}" />
    <property name="password" value="${xxx.password}" />
    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="3" />
    <property name="maxIdleTime" value="20" />
</bean>

但是,我对如何在使用 Spring 嵌入式数据库时定义它感到困惑。

免责声明:我对春天真的很陌生。

【问题讨论】:

标签: sql spring connection-pooling hsqldb c3p0


【解决方案1】:

关注这个link:

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    public static ComboPooledDataSource newDefaultDS() {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setMinPoolSize(1);
        dataSource.setMaxPoolSize(1);
        dataSource.setMaxIdleTime(20);

        return dataSource;
    }
}

import java.beans.PropertyVetoException;
import java.sql.Driver;

import org.springframework.jdbc.datasource.embedded.ConnectionProperties;
import org.springframework.jdbc.datasource.embedded.DataSourceFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ComboPoolDataSourceFactory implements DataSourceFactory,
        ConnectionProperties {
    private final ComboPooledDataSource dataSource;

    public ComboPoolDataSourceFactory() {
        this(C3P0Utils.newDefaultDS());
    }

    public ComboPoolDataSourceFactory(ComboPooledDataSource dataSource) {
        assert dataSource != null;
        this.dataSource = dataSource;
    }

    public ConnectionProperties getConnectionProperties() {
        return this;
    }

    public ComboPooledDataSource getDataSource() {
        return dataSource;
    }

    public void setUsername(String username) {
        dataSource.setUser(username);
    }

    public void setPassword(String password) {
        dataSource.setPassword(password);
    }

    public void setUrl(String url) {
        dataSource.setJdbcUrl(url);
    }

    public void setDriverClass(Class<? extends Driver> driverClass) {
        try {
            dataSource.setDriverClass(driverClass.getName());
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
    }
}

import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;

public class EmbeddedC3P0DatabaseBuilder extends EmbeddedDatabaseBuilder {
    public EmbeddedC3P0DatabaseBuilder() {
        setDataSourceFactory(new ComboPoolDataSourceFactory());
    }
}

还有一个简短的用法示例:

EmbeddedC3P0DatabaseBuilder builder = new EmbeddedC3P0DatabaseBuilder();
        EmbeddedDatabase db = builder
                .setType(EmbeddedDatabaseType.H2)
                .addScript("setup-tables.sql")
                .build();

        JdbcTemplate template = new JdbcTemplate(db);
                ....
        db.shutdown();

【讨论】:

  • 感谢您的帮助。很棒的解决方案。这真的很有帮助!
  • 如何使用 spring 3 做到这一点? setDataSourceFactory 仅存在于 spring 4
  • 嗯,在this JIRA issue EmbeddedDatabaseBuilder 中已得到改进。我没有看到任何其他方法,而是从 Spring 3 中复制 EmbeddedDatabaseBuilder 中的所有代码到您的 EmbeddedC3P0DatabaseBuilder 中并引入 setDataSourceFactory 方法,就像在 Spring 4 中一样。我看到该字段甚至不是protected 并且除了你自己的EmbeddedDatabaseBuilder 版本之外似乎没有任何修改它的方法。
  • 感谢 Andrei 的建议!您对这方面的深入了解让我感到惊讶!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多