2013-04-14 48 views
3

基本上我想決定運行哪個數據庫項目。如何在單獨的文件中連接多個數據庫(hsqldb,mysql)和數據庫設置

我有以下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. 什麼是這種問題的專業方法(假設項目finaly將使用MySQL) - 應用程序應該總是使用MySQL,HSQLDB應該只用於運行測試類?
+0

您的項目是一個Web應用程序? – Ralph

+0

@Ralph是的,它是Web應用程序。 – abrasadera

回答

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 { 

指定的數據庫用於測試

1

所以我建議服務器通過JNDI提供數據庫連接。

另外,您需要定義數據庫Dialact。因此我建議使用服務器參數。

對於測試用例,我將使用其他數據庫配置文件,該文件不使用jndi,而是配置數據庫,就像您需要它進行測試一樣。


例如Tomcat中:

<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" /> 

春天的context.xml(全球或更好的應用特定的context.xml):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的數據庫「集成」測試我會在沒有jndi和dialect屬性佔位符的src\test\resources(它「覆蓋」測試的正常測試)中添加一個特定測試applicationContext-db.xml

@查看此答案的其他信息Spring Configuration - 它描述瞭如何爲測試命名applicationContext-db.xml的其他方法。