3

基本上我想决定使用 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。我已经看到了一些解决方案:

我想知道什么是最好的方法,但我想将数据库设置保存在单独的文件中。

  1. 我应该创建database.properties2文件(带有 HSQL 属性)并添加propertyConfigurer2吗?以及如何让dataSource bean知道要使用哪个propertyConfigurer(我感觉我错过了什么)?
  2. 也许它应该由maven完成?
  3. 解决此类问题的专业方法是什么(假设项目最终将使用 MySQL)- 应用程序应始终使用 MySQL,而 HSQLDB 应仅用于运行测试类?
4

2 回答 2

2

@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>  
  1. 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>
    

  2. 然后我修改并添加了两个数据库的配置文件:

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

现在,如果我使用“默认”运行(在我的情况下为 Tomcat)服务器- 没什么特别的 - 使用 MYSQL 数据库但是如果我使用参数运行服务器

-Dspring.profiles.active="testing"

它使用给定的配置文件,所以我的项目使用 HSQLDB HOORAY

此外,当我在测试类中添加特定配置文件时(就在类名声明之前):

 @ActiveProfiles("default")
public class UserServiceTest {

指定的数据库用于测试

于 2013-04-15T19:22:35.763 回答
1

所以我建议服务器通过 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&amp;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.xmlsrc\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 的数据库“集成”测试,我会在applicationContext-db.xml没有 jndi 和方言属性占位符的情况下放置一个特定的测试src\test\resources(它“覆盖”了测试的正常测试)。

@See this answer以获取更多信息Spring Configuration - 它描述了如何applicationContext-db.xml为测试命名的另一种方式。

于 2013-04-15T06:14:05.460 回答