2014-10-02 3 views
1

내 응용 프로그램에는 각 클라이언트에 대해 여러 데이터베이스가 있습니다. 응용 프로그램에 로그인 한 클라이언트별로 데이터베이스에 액세스하려고합니다.최대 절전 모드에서 SessionFactory를 동적으로 생성

두 가지 옵션이 있습니다.
1) hibernate-config.xml 파일에서 여러 SessionFactory 항목 사용.
2) 최대 절전 모드 파일을 복제합니다.

하지만 런타임에 LocalSessionFactoryBean, SessionFactory, TransactionManager를 만들고 싶습니다. 그러면 어떻게해야합니까? hibernate-config.xml 파일에서 SessionFactory와 DataSource의 다중 엔트리를하고 싶지 않습니다.

나는 아래 발췌 문장을 시도했다.

@Configuration 
@EnableTransactionManagement 
public class PersistenceHibernateConfig 
{ 

    private String driverClassName; 

    private String url; 

    String   hibernateDialect; 

    boolean   hibernateShowSql; 

    @Bean 
    public LocalSessionFactoryBean alertsSessionFactoryBean() 
    { 
     final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(this.restDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.ezdi.cac.bean.table" }); 
     sessionFactory.setHibernateProperties(this.hibernateProperties()); 

     return sessionFactory; 
    } 

    @Bean 
    public DataSource restDataSource() 
    { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(this.driverClassName); 
     dataSource.setUrl(this.url); 
     dataSource.setUsername("root"); 
     dataSource.setPassword("root"); 

     return dataSource; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager() 
    { 
     final HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(this.alertsSessionFactoryBean().getObject()); 

     return txManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslationPostProcessor() 
    { 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

    @Bean 
    public PersistenceExceptionTranslator exceptionTranslator() 
    { 
     return new HibernateExceptionTranslator(); 
    } 

    final Properties hibernateProperties() 
    { 
     return new Properties() 
     { 
      { 
       this.put("persistence.dialect", PersistenceHibernateConfig.this.hibernateDialect); 
       this.put("hibernate.show_sql", PersistenceHibernateConfig.this.hibernateShowSql); 
      } 
     }; 

    } 

    /** 
    * @return the driverClassName 
    */ 
    public String getDriverClassName() 
    { 
     return driverClassName; 
    } 

    /** 
    * @param driverClassName the driverClassName to set 
    */ 
    public void setDriverClassName(String driverClassName) 
    { 
     this.driverClassName = driverClassName; 
    } 

    /** 
    * @return the url 
    */ 
    public String getUrl() 
    { 
     return url; 
    } 

    /** 
    * @param url the url to set 
    */ 
    public void setUrl(String url) 
    { 
     this.url = url; 
    } 

    /** 
    * @return the hibernateDialect 
    */ 
    public String getHibernateDialect() 
    { 
     return hibernateDialect; 
    } 

    /** 
    * @param hibernateDialect the hibernateDialect to set 
    */ 
    public void setHibernateDialect(String hibernateDialect) 
    { 
     this.hibernateDialect = hibernateDialect; 
    } 

    /** 
    * @return the hibernateShowSql 
    */ 
    public boolean isHibernateShowSql() 
    { 
     return hibernateShowSql; 
    } 

    /** 
    * @param hibernateShowSql the hibernateShowSql to set 
    */ 
    public void setHibernateShowSql(boolean hibernateShowSql) 
    { 
     this.hibernateShowSql = hibernateShowSql; 
    } 

} 

하지만 LocalSessionFactoryBean의를 통해도 HibernateTransactionManager를 통해 SessionFactory를 얻을 때마다, 나는 내가 널 거지 이유를 모르는 null.I있어?

답변

3

이 요구 사항에 맞게 조정 된 최대 절전 모드 멀티 테넌시 (Look at Hibernate Multi-Tenancy)가 있어야합니다. Hibernate 4.x 이후부터는 다중 SessionFactory을 사용하는 대신 사용할 수 있고 사용하도록 권고된다. 이 post을 통해 이동하십시오. 다음

0

모든 단지 웹 응용 프로그램의 감각을 가지고,하지만 질문으로

당신이 연결된 사용자 이름에서 데이터베이스 이름을 얻을 수있는 방법이 있고 데이터베이스에 액세스하지 않는 가정 ... 스프링 MVC 태그가 사용자가 기록되고 세션이 설정 될 때까지 모든 항목을 세션 범위에 넣을 수 있습니다.

그냥 관련 콩에 범위 주석을 추가 :

@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES) 

가 트랜잭션 관리를 위해도 (당신이 인터페이스를 통해 콩을 결합 제공 JDP 프록시를 사용하려면 최소한 데이터 소스와의 SessionFactory의 경우해야하고, 정상적으로 사용되는 경우). 클래스를 사용해야하기 때문에 클래스가 중단되면 proxyMode=ScopedProxyMode.TARGET_CLASS을 사용하십시오.

그런 식으로 (싱글 톤 빈) Dao에서 세션 팩토리를 바인드 할 수도 있습니다. 범위가 지정된 프록시 덕분에 각 사용자는 자체를 사용할 것입니다.

섬세한 부분은 올바른 URL을 반환해야하므로 getUrl() 메서드를 작성하는 것입니다. 하지만 세션 범위 Bean을 사용하여 URL을 저장하고 로그인 할 때 URL을 저장할 수도 있습니다.