如何将多个数据库( hsqldb、mysql )与单独文件中的 DB 设置连接起来
Posted
技术标签:
【中文标题】如何将多个数据库( hsqldb、mysql )与单独文件中的 DB 设置连接起来【英文标题】:How connect multiply databases ( hsqldb, mysql ) with DB setting in separate files 【发布时间】:2013-04-14 07:55:12 【问题描述】:基本上我想决定使用 2 个数据库项目中的哪一个来运行。
我有以下 hibernateContext.xml
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:database.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="$jdbc.driver" />
<property name="url" value="$jdbc.url" />
<property name="username" value="$jdbc.user" />
<property name="password" value="$jdbc.password" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.blog.przem.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.mysqlDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
还有database.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pbdb
jdbc.user=root
jdbc.password=
我想要实现的是将 HSQLDB 添加到我的项目中(用于开发、测试),但对于生产我想要 MySQL DB。 我已经看到了一些解决方案:
在spring配置文件Can I use HSQLDB for junit testing cloning a mySQL database 在 maven 中 http://www.manydesigns.com/en/portofino/portofino3/tutorials/using-maven-profiles-and-resource-filtering 我想知道什么是最好的方法,但我想将数据库设置保存在单独的文件中。-
我应该创建 database.properties2 文件(带有 HSQL 属性)并添加 propertyConfigurer2 吗?以及如何让 dataSource bean 知道要使用哪个 propertyConfigurer(我感觉我错过了什么)?
也许应该由 maven 完成?
什么是解决此类问题的专业方法(假设项目最终将使用 MySQL)- 应用程序应始终使用 MySQL,而 HSQLDB 应仅用于运行测试类?
【问题讨论】:
你的项目是网络应用吗? @Ralph 是的,它是网络应用程序。 【参考方案1】:@Ralph 的回答很好用,有人告诉我它是大型项目的好解决方案,我得到了另一个解决方案,如何解决我的问题,因此可以为项目和测试文件设置许多数据库,而无需创建额外的 applicationContext-db .xml(但我不知道为测试使用单独的配置 xml 是否比下面介绍的方法更好)
那段代码稍微改变了我的 hibernateContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="$jdbc.driver" />
<property name="url" value="$jdbc.url" />
<property name="username" value="$jdbc.user" />
<property name="password" value="$jdbc.password" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.blog.przem.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">$jdbc.hibernate.dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.hbm2ddl.auto">create-drop</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.transaction.flush_before_completion">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
PropertyPlaceholderConfigurer 被提取(删除了 id="propertyConfigurer")到新文件 proprtiesContext.xml (当然是添加到hibernateContext.xml)
<beans profile="default">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:msql_database.properties</value>
</list>
</property>
</bean>
</beans>
<beans profile="testing">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:hsql_database.properties</value>
</list>
</property>
</bean>
</beans>
然后我修改并添加了两个数据库的配置文件:
msql_database.propertie
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pbdb
jdbc.user=root
jdbc.password=
jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
hsql_database.propertie
jdbc.driver=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:mem;shutdown=true
jdbc.user=sa
jdbc.password=
jdbc.hibernate.dialect=org.hibernate.dialect.HSQLDialect
现在,如果我使用 "default" 运行(在我的情况下为 Tomcat)服务器它 - 没什么特别的 - 使用 MYSQL 数据库 但是如果我用参数运行服务器
-Dspring.profiles.active="testing"
它使用给定的配置文件,所以我的项目使用 HSQLDB HOORAY
另外,当我在测试类中添加特定配置文件时(就在类名声明之前):
@ActiveProfiles("default")
public class UserServiceTest
指定的数据库用于测试
【讨论】:
【参考方案2】:所以我建议服务器通过 JNDI 提供数据库连接。
此外,您需要定义数据库方言。因此我建议使用服务器参数。
对于测试用例,我会使用其他数据库配置文件,它不使用 jndi,而是按照测试所需的方式配置数据库。
例如在 Tomcat 中:Context.xml(全局或更好的应用程序特定的 context.xml)
<Resource name="jdbc/yourApp" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/pbdb?useUnicode=true&characterEncoding=utf8"
auth="Container"
username="" password="geheim"
maxIdle="3" maxActive="15" maxWait="10000" logAbandoned="true" removeAbandoned="true"
removeAbandonedTimeout="60" validationQuery="select 1" />
<Parameter name="yourApp.database.dialect" value="mysql" override="false" />
弹簧:applicationContext-db.xml
in src\main\resources
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/yourApp"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.blog.przem.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">$yourApp.database.dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
现在您可以使用不同的数据库在每个应用服务器上配置应用程序。
对于基于 Spring 的数据库-“集成”测试,我会在 src\test\resources
中放置一个特定于测试的 applicationContext-db.xml
,而不使用 jndi 和方言属性占位符(它会“覆盖”测试的正常测试)。
@有关更多信息Spring Configuration,请参阅此答案 - 它描述了如何为测试命名 applicationContext-db.xml
的另一种方式。
【讨论】:
以上是关于如何将多个数据库( hsqldb、mysql )与单独文件中的 DB 设置连接起来的主要内容,如果未能解决你的问题,请参考以下文章
如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?
如何将 HSQLDB 与 Ruby on Rails 一起使用。