【问题标题】:Spring and Hibernate with multiple databasesSpring 和 Hibernate 与多个数据库
【发布时间】:2017-12-18 12:44:50
【问题描述】:

晚上好, 处理两个或多个数据库的正确和常用方法是什么?

考虑这个 HibernateConfiguration 类只配置一个数据源:

@Configuration @EnableTransactionManagement
@PropertySource(value = { "classpath:hibernate.properties" })
public class HibernateConfiguration {

    @Autowired 
    private Environment env;

    @Bean 
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        // ... setting data source
        return dataSource;
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        // ... setting Hibernate properties
        return properties;
    }

    @Bean 
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(getDataSource());
        sessionFactory.setPackagesToScan(new String[] { "POJOs'" });
        sessionFactory.setHibernateProperties(getHibernateProperties());
        return sessionFactory;
    }

    @Bean public HibernateTransactionManager transactionManager(SessionFactory sf) {
        HibernateTransactionManager htm = new HibernateTransactionManager();
        htm.setSessionFactory(sf);
        return htm;
    }
}

是否建议让一个类配置一个数据源?或者一次配置就足够了?如何在 Dao 类中指定将使用哪个 SessionFactory?如果在两个不同的托管服务器上切换两个完全相同的数据库,推荐的方法是什么?

示例 DAO。首先我需要在FooBar 之间切换。

@Repository
public class RepositoryImpl implements RepositoryDao {

@Autowired // Here I need to switch between databases "foo" and "bar"
private SessionFactory sessionFactory;

...

我需要在示例数据库Foo 上修复第二个。

@Repository
public class FooImpl implements FooDao {

@Autowired // Here I need fixed on "Foo"
private SessionFactory sessionFactory;

【问题讨论】:

  • 两个或更多的数据库基本上只是意味着两个或更多的数据存储。你会使用spring-data吗?
  • 我只使用 Spring Core、Spring ORM 和 Hibernate 作为问题下方的标签:)
  • 可以在sessionFactory注入中添加@Qualifier来区分2个工厂。所以我建议为每个数据源配置 2 个配置类,包括 2 个会话和 2 个事务管理器。
  • 用你的cmets,你回答了我。谢谢你:)
  • 不客气!

标签: java mysql spring hibernate datasource


【解决方案1】:

一种方法

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSource fooDataSource() {
        return fooDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties("app.datasource.bar")
    public BasicDataSource barDataSource() {
        return (BasicDataSource) DataSourceBuilder.create()
                .type(BasicDataSource.class).build();
    }

Spring multiple datasources config

其他方法可能是:从 persistence.xml 加载不同的映射 (orm.xml) 或引用实体类中的不同架构。

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2012-01-31
    • 1970-01-01
    • 2014-07-24
    • 2010-12-26
    • 1970-01-01
    • 2011-03-08
    • 2018-11-19
    • 2015-11-18
    相关资源
    最近更新 更多