Как добавить новый источник данных во время выполнения Spring Boot - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть это, но я не могу найти никакого возможного решения.Все ответы, которые я нашел, были о настройке двух или более Datasource или Multitenant Dabatase, но это не то, что мне нужно.Я должен сделать это:

  1. Конфигурировать 1-й источник данных из application.properties.Это основная конфигурация базы данных
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        basePackages = "com.example.primary")
public class SmartConnectConfig {

    @Primary
    @Bean(name = "primaryDatasource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }

    @Primary
    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("primaryDatasource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.primary")
                .persistenceUnit("primary")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
Когда пользователь, подключенный к системе, в зависимости от организации делает запрос и получает все свойства или базу данных организации, сохраненную в 1-й базе данных, для получения конфигурации 2-го источника данных (URL-адрес, имя пользователя, пароль, имя-драйвера-класса).Это ОЧЕНЬ ВАЖНО , потому что в зависимости от имени пользователя мне нужно создавать разные источники данных в зависимости от организации. Добавить в Spring для управления некоторым хранилищем с помощью 2-го источника данныхПримечание: 1-й и 2-й репозитории находятся в разных пакетах, поскольку Spring может выполнить сканирование этих репозиториев, второй пакет - "com.example.second".

Кто-то может дать некоторые предложения.Спасибо

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я предлагаю вам попробовать сохранить информацию об источнике данных в HttpSession.

Пример:

@RestController
public class CategoryController {

  @PostMapping("init")
  public void createDatasource(HttpSession session, @RequestBody CategoryRequestDto request) {
    if (session != null && session.isNew()) {
        DBInfo dbInfo = request.getUserinfo().getDatabaseInfo();
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setUsername(dbInfo.getUsername());
        hikariDataSource.setPassword(dbInfo.getPassword());
        hikariDataSource.setJdbcUrl("jdbc:h2:mem:"+session.getId());
        hikariDataSource.setDriverClassName(Driver.class.getName());
        session.setAttribute("datasource", hikariDataSource);// store datasource for later use
    }
  }
}
0 голосов
/ 07 февраля 2019

Если вам нужно настроить два источника данных, вам нужно вызвать его только с разными именами, например:

@Bean("dataSource")
public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(this.hProperties.getProperty("db.driverClass"));
        dataSource.setUrl(this.hProperties.getProperty("db.location"));
        dataSource.setUsername(this.hProperties.getProperty("db.username"));
        dataSource.setPassword(this.hProperties.getProperty("db.password"));
        return dataSource;
    }
    @Bean("dataSourceTwo")
    public DataSource getDataSourceLucca() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(this.hProperties.getProperty("db.lucca.driverClass"));
        dataSource.setUrl(this.hProperties.getProperty("db.lucca.location"));
        dataSource.setUsername(this.hProperties.getProperty("db.lucca.username"));
        dataSource.setPassword(this.hProperties.getProperty("db.lucca.password"));
        return dataSource;
    }


@Bean("sessionFactory")
public LocalSessionFactoryBean getSessionFactory() {
    loadProperties();
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(getDataSource());
    sessionFactory.setPackagesToScan(new String[] { "com.monty.goofy" });
    sessionFactory.setHibernateProperties(getHibernateProperties());
    return sessionFactory;
}
@Bean("sessionFactoryTwo")
public LocalSessionFactoryBean getSessionFactoryTwo() {
    loadProperties();
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(getDataSourceTwo());
    return sessionFactory;
}
@Bean("transactionManager")
public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    SessionFactory sessionFactory = getSessionFactory().getObject(); 
    txManager.setSessionFactory(sessionFactory);
    return txManager;
}
@Bean("transactionManagerTwo")
public HibernateTransactionManager transactionManagerLucca() {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    SessionFactory sessionFactoryTwo = getSessionFactoryTwo().getObject(); 
    txManager.setSessionFactory(sessionFactoryTwo);
    return txManager;
}

Это пример использования обоих из них:

@Override
@Transactional("transactionManager")
public void saveOne(){

}
@Override
@Transactional("transactionManagerTwo")
public void saveTwo(){

}

(это ручная настройка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...