2011-12-13 97 views
1

我有一個需要在數據庫模式之間動態切換的Spring + Hibernate/Flex應用程序。爲了達到這個目的,我在this文章中實現了AbstractRoutingDataSource。不幸的是,在dataSource之間切換不起作用。 有人可以幫助我嗎?使用Spring和Hibernate使用會話工廠處理多個數據庫連接

我跟着這個鏈接:Spring + Hibernate SessionFactory + AbstractRoutingDataSource

我的代碼是: - 的ApplicationContext:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"> 
     <value>${jdbc.driverClassName}</value> 
    </property> 
    <property name="url"> 
     <value>${jdbc.url}</value> 
    </property> 
    <property name="username"> 
     <value>${jdbc.username}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password}</value> 
    </property> 
</bean> 

<bean id="dataSource2" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"> 
     <value>${jdbc.driverClassName}</value> 
    </property> 
    <property name="url"> 
     <value>${jdbc.url2}</value> 
    </property> 
    <property name="username"> 
     <value>${jdbc.username2}</value> 
    </property> 
    <property name="password"> 
     <value>${jdbc.password2}</value> 
    </property> 
</bean> 

<bean id="routingDS" class="br.com.cpb.gtf.infra.RoutingDataSource"> 
    <property name="targetDataSources"> 
     <map key-type="java.lang.String"> 
     <entry key="br.com.cpb.gtf.infra.SchemaConstants.TESTE" value-ref="dataSource2"/> 
     <entry key="br.com.cpb.gtf.infra.SchemaConstants.PRODUCAO" value-ref="dataSource"/>    
     </map> 
    </property> 
    <property name="defaultTargetDataSource" ref="dataSource2"/> 
</bean> 



<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="br.com.cpb.*" /> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.SQLServerDialect 
      </prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 

      <prop key="hibernate.query.substitutions">true '1', false '0'" </prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

-RoutingDataSource:

package br.com.cpb.gtf.infra; 

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class RoutingDataSource extends AbstractRoutingDataSource { 

    @Override 
    protected Object determineCurrentLookupKey() 
    { 
     return Globals.getSchema(); 
    } 

} 

-SchemaConstants

package br.com.cpb.gtf.infra; 

public class SchemaConstants { 

    public static final String PRODUCAO = "dataSource"; 
    public static final String TESTE = "dataSource2"; 

} 

-Globals:

package br.com.cpb.gtf.infra; 

public class Globals { 
    private static final ThreadLocal<String> schemaHolder = new ThreadLocal<String>(); 

    public static void setSchema(String schema) { 
     schemaHolder.set(schema); 
    } 

    public static String getSchema() { 
     return schemaHolder.get(); 
    } 

    public static void clearCustomerType() { 
     schemaHolder.remove(); 
    } 
} 

- 服務:

@RemotingInclude 
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
public Adm_Usuario logar(Adm_Usuario user) { 

    Globals.clearCustomerType(); 
    Globals.setSchema(SchemaConstants.TESTE); 


    Adm_UsuarioDao dao = new Adm_UsuarioDao(sessionFactory); 
    Adm_Usuario admUsuario = dao.logar(user);  

    setLoggedUserOnSession(admUsuario); 
    return admUsuario; 

} 
+0

你讀過的答案你提到的問題至? – axtavt

回答

1
<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 

在屬性DataSource,裁判應該是routingDS:

<property name="dataSource" ref="routingDS" /> 
相關問題