【问题标题】:Change datasource properties for JPA Spring Configuration during runtime在运行时更改 JPA Spring 配置的数据源属性
【发布时间】:2017-11-06 18:01:44
【问题描述】:

我正在做一个需要连接多个数据库的 Spring 项目。

我使用的示例都是使用属性连接到一个数据库,在应用程序开始时设置。

我当前的 JPA 配置如下所示:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "com.google.persistence.model" });

      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
   }

   @Bean
   public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
      dataSource.setUsername( "user" );
      dataSource.setPassword( "password" );
      return dataSource;
   }

   @Bean
   public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(emf);

      return transactionManager;
   }

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

   Properties additionalProperties() {
      Properties properties = new Properties();
      properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
      properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
      return properties;
   }
}

在这种情况下,数据源属性(驱动程序、url、用户名、密码)已经设置。但是是否有可能修改这个当前的 bean 或创建一个允许我在运行时修改这些属性的新方法?

例如,当应用程序运行时,我是否可以手动断开与当前数据库的连接,修改数据源属性,然后重新连接到新数据库?

【问题讨论】:

  • JPA 提供程序不允许您更改 EntityManagerFactory 以在其生命周期内持久保存到不同的数据存储;这是在施工时设置的。
  • @DN1 感谢您提供的信息。但是如果我的应用程序运行时数据库的 url 或用户名发生了变化怎么办?如果无法更改数据源的任何属性,是否意味着我必须先停止应用程序才能进行任何更改?
  • 你必须关闭电动势,并创建一个新的

标签: java spring hibernate spring-mvc jpa


【解决方案1】:

您不能在运行时更改此属性,但如果您需要使用多个数据库,您可以创建多个持久性单元。在这里您可以找到示例:

http://www.baeldung.com/spring-data-jpa-multiple-databases

【讨论】:

    【解决方案2】:

    您正在寻找的功能称为多租户。

    例如,请参阅this 指南。

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多