spring - 连接池简化 In memory DB testing + which pool library

标签 spring testing connection pool

我正在开发一个包含多个 Maven 模块(域、API 和客户端)的项目 API只依赖域,客户端只依赖API 我还有 2 个 tomcat 服务器(开发和发布)。现在,当我需要部署到 relase 时,我很难总是手动更改连接字符串。现在我听说了连接池(DBCP、C3PO 和一个新的 HikariCP),所以我正在研究它以投入使用。

现在我还听说Spring框架可以通过Dependency injection帮助我配置Datasources。

问题: 我应该使用以上哪一个(Spring 或纯连接池库或两者)?

另外请记住,我想通过内存数据存储 (HSQLDB) 促进测试 我可以有一个配置文件来保存与 MySQL 服务器(本地主机或版本)的连接配置

如何在内存数据库 (HSQLDB) 和本地 MySQL 服务器之间交替使用 DBUnit 测试?

编辑:忘记这个

编辑2:

现在我的 applicationContext.xml 中有这个:

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:datasource.properties" />
</bean> 

<bean id="parentDataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="maximumPoolSize" value="20" />
    <property name="minimumPoolSize" value="1" />
</bean>

<bean id="developmentDataSource" parent="parentDataSource">
    <constructor-arg>
        <bean class="com.zaxxer.hikari.HikariConfig">
            <constructor-arg>
                <props>
                    <prop key="dataSource.url">${dev.url}</prop>
                    <prop key="dataSource.user">${dev.user}</prop>
                    <prop key="dataSource.password">${dev.password}</prop>
                    <prop key="dataSource.portNumber">${dev.portNumber}</prop>
                </props>
            </constructor-arg>
            <property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
        </bean>
    </constructor-arg>
</bean>

<bean id="releaseDataSource" parent="parentDataSource">
    <constructor-arg>
        <bean class="com.zaxxer.hikari.HikariConfig">
            <constructor-arg>
                <props>
                    <prop key="dataSource.url">${release.url}</prop>
                    <prop key="dataSource.user">${release.user}</prop>
                    <prop key="dataSource.password">${release.password}</prop>
                    <prop key="dataSource.portNumber">${release.portNumber}</prop>
                </props>
            </constructor-arg>
            <property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
        </bean>
    </constructor-arg>
</bean>

如果我在父 bean 中定义 dataSourceClassName 属性,我会得到一个错误 我也不能在父 bean 上使用 destroy-method(我不知道我是否需要它)

你可以添加任何东西来让它更好地使用

现在我可以将内存数据库中的 HSQLDB 添加到列表中以进行测试吗?

最佳答案

我是 HikariCP 的开发者之一.几乎所有的连接池都应该允许你做你想做的事。您只需要属性文件中的连接和池配置,每个数据库一个,以及一种交换它们的方法——可能通过系统属性。例如:

HikariConfig config = new HikariConfig(System.getProperty("db.propfile"));
HikariDataSource ds = new HikariDataSource(config);

然后只需使用 -Ddb.propfile=mysql.properties-Ddb.propfile=hsqldb.properties 启动。或者,您可以使用类似 Spring 的东西,尽管使 Spring 配置动态化可能会更棘手——除非您以类似的方式换出 Spring 配置文件。

编辑:如果您在生产中使用 MySQL 并在测试中使用 HSQLDB,您甚至可以将系统属性默认设置为 MySQL 配置,因此如果未指定 db.propfile 属性,它会使用:

System.getProperty("db.propfile", "mysql.properties")

如果您部署在 WAR 中,您可能需要将路径设置为相对路径。比如相对于WEB-INF:

HikariConfig config = new HikariConfig("./WEB-INF/" + System.getProperty("db.propfile"));

关于spring - 连接池简化 In memory DB testing + which pool library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326789/

相关文章:

java - 从控制台禁用/更改 Spring Boot 的 ApplicationContext 的时间戳

java - 如何限制使用 Spring-Boot 和 OAuth2 登录特定域

testing - 使用 webdriver 上传文件

javascript - TypeError : Method Promise.原型(prototype)。然后在不兼容的接收器代理上调用

.net - 如何检查LINQ to SQL连接错误

mongodb - 无法连接到docker容器中的mongodb

java - 如何在 Spring Boot Rest 和 Postman 中使用表单数据来保存用户?

java - 如何在 spring data solr 中搜索关键字作为忽略大小写?

ios - 使用 NSOperations 和 Coredata 在 iOS 应用程序中测试 API 请求层的建议

java - MySQL 的 JDBC 连接问题