【问题标题】:multiple datasource in spring boot for mysql and mongomysql和mongo的spring boot中的多个数据源
【发布时间】:2017-11-08 22:01:45
【问题描述】:

我是弹簧靴的新手。我的要求是同时使用 mysql 和 mongo 数据库。对于某些与事务相关的操作,我将使用 mysql 并出于获取目的,我会将数据存储/检索到 mongo。我经历了很多考试,现在我完全糊涂了。我想要一些像 JPArepository 这样的结构,我可以在其中使用内置方法.e.g

public interface CustomerRepository extends MongoRepository<Customer, String> {}

public interface UserRepository extends CrudRepository<User, Long> { }

只需提及连接,它将指向正确的数据库。我在两个数据库中都有很多表。一个示例示例也将有助于如何使用不同的连接编写查询。

【问题讨论】:

  • 您的意思是两个数据源都使用相同的客户实体,并且您希望在每个数据库中拥有不同的存储库,例如 MongoCustomerRepository 和 MySQLCustomerRepository 对吗?
  • 没有两个不同的存储库来管理不同的表。例如。我们将在 mysql 上有客户、付款明细和所有私人数据。其他数据如 coomon 详细信息/可搜索数据将被放入 mongo 集群。

标签: java spring spring-boot


【解决方案1】:

这是一个例子 @EnableJpaRepositories

  • 使用 basePackages 指定要扫描带注释组件的包。

  • 使用 em.setPackagesToScan 设置是否对类路径中的实体类使用基于 Spring 的扫描。

让我们按照代码创建 mysql 和 mongo 配置类。

对于 MySQL

@Configuration
@EnableJpaRepositories(basePackages = {"yourpackage.mysql.repositories"},
    entityManagerFactoryRef = "mysqlEntityManagerFactory",
    transactionManagerRef = "mysqlTransactionManager")
@EnableTransactionManagement
public class mysqlConfig {

@Bean(name = "mysqlEntityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSourceWrite());
    em.setPackagesToScan(new String[]{"yourpackage.mysql.entities"});
    em.setPersistenceUnitName("trueid");
    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());

    return em;
}

@Bean(name = "dataSourceMysql",destroyMethod = "close")
public DataSource dataSource() {
    ...
    return dataSource;
}


@Bean(name = "mysqlTransactionManager")
public PlatformTransactionManager transactionManager(@Qualifier(value = "entityManagerFactory") EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);

    return transactionManager;
}

@Bean(name = "mysqlExceptionTranslation")
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

Properties additionalProperties() {

    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", ...);
    properties.setProperty("hibernate.show_sql", "false");
    return properties;
}


}

对于蒙古人

@Configuration
@EnableJpaRepositories(basePackages = {"yourpackage.mongo.repositories"},
    entityManagerFactoryRef = "mongoEntityManagerFactory",
    transactionManagerRef = "mongoTransactionManager")
@EnableTransactionManagement
public class mongoConfig {

@Bean(name = "mongoEntityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSourceWrite());
    em.setPackagesToScan(new String[]{"yourpackage.mongo.entities"});
    em.setPersistenceUnitName("trueid");
    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());

    return em;
}

@Bean(name = "dataSourceMongo",destroyMethod = "close")
public DataSource dataSource() {
    ...
    return dataSource;
}


@Bean(name = "mongoTransactionManager")
public PlatformTransactionManager transactionManager(@Qualifier(value = "mongoEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);

    return transactionManager;
}

@Bean(name = "mongoExceptionTranslation")
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

Properties additionalProperties() {

    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", ...);
    properties.setProperty("hibernate.show_sql", "false");
    return properties;
}


}

实体和存储库类

  • 您可以管理不同的包作为您的客户详细信息,付款详细信息,所有私有数据类应放入“yourpackage.mysql.entities”,其他数据类如 coomon 详细信息/可搜索数据将放入“yourpackage.mongo.实体”

希望对你有帮助

【讨论】:

猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 2023-03-20
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多