簡體   English   中英

spring如何編寫配置以支持2個數據庫

[英]spring how to write config to support 2 database

我嘗試使用以下配置在內存(嵌入式)中配置數據源----> mysql其他數據源----> h2:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost/item"
    p:username="" p:password="" />

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    p:dataSource-ref="dataSource">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
            <prop key="net.sf.ehcache.configurationResourceName">/ehcache.xml</prop>
        </props>
    </property>
    <property name="packagesToScan" value="*************" />
</bean>

<!-- Spring transaction management -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />

<tx:annotation-driven transaction-manager="transactionManager" />


<bean id="org.h2.tools.Server" class="org.h2.tools.Server" scope="singleton" factory-method="createTcpServer"
      init-method="start" depends-on="org.h2.tools.Server-WebServer">
    <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,9092"/>
</bean>

<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" scope="singleton" factory-method="createWebServer" init-method="start">
    <constructor-arg value="-web,-webAllowOthers,true,-webPort,8082"/>
</bean>

<!-- notice that loading the Driver as a bean is unnecessary is most cases! u could safely remove this and the depends-on in the next bean -->

<bean id="H2DatabaseJDBCDriver" class="org.h2.Driver" scope="singleton" init-method="load" depends-on="org.h2.tools.Server"/>


<bean id="H2InMemoryDB"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    depends-on="org.h2.tools.Server">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:appdb1;DB_CLOSE_DELAY=-1" />
    <!-- ;TRACE_LEVEL_FILE=3;TRACE_LEVEL_SYSTEM_OUT=3 -->
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean id="H2InMemoryDBPool" class="org.apache.commons.pool.impl.GenericObjectPool">
    <!-- Two connections: InMemoryEntityManagerFactory and transactionManager -->
    <property name="minIdle" value="1"/>
    <property name="maxWait" value="10"/>
    <property name="maxActive" value="10"/>
    <property name="maxIdle" value="10"/>
    <property name="minEvictableIdleTimeMillis" value="300000"/>
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>

<bean id="H2InMemoryDBDSConnFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
    <constructor-arg><ref bean="H2InMemoryDB"/></constructor-arg>
</bean>

<bean id="H2InMemoryDBPoolableConnFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory">
    <constructor-arg index="0"><ref bean="H2InMemoryDBDSConnFactory"/></constructor-arg>
    <constructor-arg index="1"><ref bean="H2InMemoryDBPool"/></constructor-arg>
    <constructor-arg index="2"><null/></constructor-arg>
    <constructor-arg index="3"><null/></constructor-arg>
    <constructor-arg index="4"><value>false</value></constructor-arg>
    <constructor-arg index="5"><value>true</value></constructor-arg>
</bean>

<bean id="pooledInMemoryDB" class="org.apache.commons.dbcp.PoolingDataSource" depends-on="H2InMemoryDBPoolableConnFactory">
    <constructor-arg><ref bean="H2InMemoryDBPool"/></constructor-arg>      
</bean>   



 <bean id="sessionFactory2"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    p:dataSource-ref="pooledInMemoryDB">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
    <property name="packagesToScan" value="********" />

</bean>

    <bean id="transactionManager2"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />

但它不起作用。

所以我的問題是:

我是否需要使用2個會話工廠或使用動態數據源開關?

謝謝

我確實發現了可能導致您的代碼中斷的錯字。

您的第二個transactionmanager引用第一個sessionFactory。 我認為您希望它引用第二個事務管理器。 嘗試:

<bean id="transactionManager2"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory2" />

關於您是否必須使用此處所述的某種“動態數據源開關”的問題 ,多個數據源應該就可以了。

我用

 <jdbc:embedded-database id="embeddedDatasource" type="DERBY">
    <jdbc:script location="classpath:test.sql"/>
 </jdbc:embedded-database>

代替

有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM