【问题标题】:Jhipster - Configure multiple datasourcesJhipster - 配置多个数据源
【发布时间】:2018-04-08 11:33:18
【问题描述】:

我有 springBatch 应用程序,我在其中使用了多个数据源,我配置如下,这非常简单。它工作正常。

How to use 2 or more databases with spring?

现在我必须将它集成到 Jhipster 项目中。我在 application.yml 中做了类似的配置。我从 application.yml 中删除了自动生成的数据源,并添加了与上述帖子类似的配置,并将主数据源注入到 Jhipster 生成的类 DataBaseConfiguration.java 中。使用此配置,我无法对来自 JHipster UI 的数据库实体进行 CRUD 操作。我在日志中没有看到任何错误。

我不确定在 Jhipster 项目中配置多个数据源的正确/简单方法是什么。使用多个数据库的示例示例将为我提供一个良好的开端。我在这方面没有找到太多资源。

以下是我为在 JHipster 中拥有多个数据源而执行的更改的代码示例

# ===================================================================
# Spring Boot configuration for the "dev" profile.
#
# This configuration overrides the application.yml file.
#
# More information on profiles: http://www.jhipster.tech/profiles/
# More information on configuration properties: http://www.jhipster.tech/common-application-properties/
# ===================================================================

# ===================================================================
# Standard Spring Boot properties.
# Full reference is available at:
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
# ===================================================================

spring:
    profiles:
        active: dev
        include: swagger
    devtools:
        restart:
            enabled: true
        livereload:
            enabled: false # we use gulp + BrowserSync for livereload
    jackson:
        serialization.indent_output: true

    jpa:
        database-platform: org.hibernate.dialect.Oracle12cDialect
        database: ORACLE
        show-sql: true
        properties:
            hibernate.id.new_generator_mappings: true
            hibernate.cache.use_second_level_cache: false
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: true
            hibernate.default_schema: ********x
    mail:
        host: localhost
        port: 25
        username:
        password:
    messages:
        cache-seconds: 1
    thymeleaf:
        cache: false

    batch:
        job:
          enabled: false

liquibase:
    contexts: dev

# ===================================================================
# To enable SSL, generate a certificate using:
# keytool -genkey -alias ********x-storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
#
# You can also use Let's Encrypt:
# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm
#
# Then, modify the server.ssl properties so your "server" configuration looks like:
#
# server:
#    port: 8443
#    ssl:
#        key-store: keystore.p12
#        key-store-password: <your-password>
#        keyStoreType: PKCS12
#        keyAlias: ********x
# ===================================================================
server:
    port: 8080

# ===================================================================
# JHipster specific properties
#
# Full reference is available at: http://www.jhipster.tech/common-application-properties/
# ===================================================================

jhipster:
    http:
        version: V_1_1 # To use HTTP/2 you will need SSL support (see above the "server.ssl" configuration)
    # CORS is only enabled by default with the "dev" profile, so BrowserSync can access the API
    cors:
        allowed-origins: "*"
        allowed-methods: "*"
        allowed-headers: "*"
        exposed-headers: "Authorization"
        allow-credentials: true
        max-age: 1800
    security:
        authentication:
            jwt:
                secret: my-secret-token-to-change-in-production
                # Token is valid 24 hours
                token-validity-in-seconds: 86400
                token-validity-in-seconds-for-remember-me: 2592000
    mail: # specific JHipster mail property, for standard properties see MailProperties
        from: ********x@localhost
        base-url: http://127.0.0.1:8080
    metrics: # DropWizard Metrics configuration, used by MetricsConfiguration
        jmx.enabled: true
        graphite: # Use the "graphite" Maven profile to have the Graphite dependencies
            enabled: false
            host: localhost
            port: 2003
            prefix: ********x
        prometheus: # Use the "prometheus" Maven profile to have the Prometheus dependencies
            enabled: false
            endpoint: /prometheusMetrics
        logs: # Reports Dropwizard metrics in the logs
            enabled: false
            report-frequency: 60 # in seconds
    logging:
        logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration
            enabled: false
            host: localhost
            port: 5000
            queue-size: 512

# ===================================================================
# Application specific properties
# Add your own application properties here, see the ApplicationProperties class
# to have type-safe configuration, like in the JHipsterProperties above
#
# More documentation is available at:
# http://www.jhipster.tech/common-application-properties/
# ===================================================================



datasource.********x.type: com.zaxxer.hikari.HikariDataSource
datasource.********x.url: "jdbc:oracle:thin:@********x"
datasource.********x.username: ********x
datasource.********x.password: ********x

datasource.********xy.type: com.zaxxer.hikari.HikariDataSource
datasource.********xy.url: "jdbc:oracle:thin:@yyyyyy"
datasource.********xy.username:********x
datasource.********xy.password: "********x"




package com.********x

import io.github.jhipster.config.JHipsterConstants;
import io.github.jhipster.config.liquibase.AsyncSpringLiquibase;

import liquibase.integration.spring.SpringLiquibase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories("com.********x")
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
public class DatabaseConfiguration {

    private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class);

    private final Environment env;

    public DatabaseConfiguration(Environment env) {
        this.env = env;
    }

    @Autowired
    @Qualifier("********x")
    private DataSource dataSource;

    @Bean
    public SpringLiquibase liquibase(@Qualifier("taskExecutor") TaskExecutor taskExecutor
            , LiquibaseProperties liquibaseProperties) {

        // Use liquibase.integration.spring.SpringLiquibase if you don't want Liquibase to start asynchronously
        SpringLiquibase liquibase = new AsyncSpringLiquibase(taskExecutor, env);
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog("classpath:config/liquibase/master.xml");
        liquibase.setContexts(liquibaseProperties.getContexts());
        liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
        liquibase.setDropFirst(liquibaseProperties.isDropFirst());
        if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE)) {
            liquibase.setShouldRun(false);
        } else {
            liquibase.setShouldRun(liquibaseProperties.isEnabled());
            log.debug("Configuring Liquibase");
        }
        return liquibase;
    }
}

所以我在 DatabaseConfiguration.java 中注入了主数据源,并在需要时使用了其他数据源。这两个数据源的创建都与上面的帖子类似,就像 spring 建议的那样。

【问题讨论】:

    标签: java spring-data-jpa jhipster


    【解决方案1】:

    这是我如何在 JHipster 项目中使两个数据源工作:

    JHipster 生成的默认数据源属性:

    spring:
        datasource:
            type: com.zaxxer.hikari.HikariDataSource
            url: jdbc:h2:file:./target/h2db/db/mockpartenaire;DB_CLOSE_DELAY=-1
            username: mockpartenaire
            password:
    

    JHispter 默认数据源的配置:

    @Configuration
    @EnableTransactionManagement
    public class PrimaryDbConfig {
    
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties defaultDataSourceProperties() {
        return new DataSourceProperties();
    }
    
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSource defaultDataSource() {
        return defaultDataSourceProperties().initializeDataSourceBuilder().build();
    }
    
    @Bean(name = "entityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
        return builder
            .dataSource(defaultDataSource())
            .packages(Input.class)
            .persistenceUnit("default")
            .build();
    }
    
    @Bean(name = "transactionManager")
    @Primary
    public JpaTransactionManager db2TransactionManager(@Qualifier("entityManagerFactory") final EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
    

    }

    第二个数据源属性:

    partner:
        datasource:
            type: com.zaxxer.hikari.HikariDataSource
            url: jdbc:postgresql://localhost:5432/partner
            username: partner
            password: partner
            driver-class-name: org.postgresql.Driver
    

    第二个数据源配置:

    @Configuration
    @EnableTransactionManagement
    @EntityScan(basePackages = "com.my.test.custom.domain")
    @EnableJpaRepositories(transactionManagerRef = "partnerTransactionManager", entityManagerFactoryRef = "partnerEntityManagerFactory", basePackages = "com.my.test.custom.repository")
    public class PartnerDbConfig {
    
        @Bean
        @ConfigurationProperties("partner.datasource")
        public DataSourceProperties partnerDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        @Bean
        @ConfigurationProperties("partner.datasource")
        public DataSource partnerDataSource() {
            return partnerDataSourceProperties().initializeDataSourceBuilder().build();
        }
    
        @Bean(name = "partnerEntityManagerFactory")
        public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
            Properties properties = new Properties();
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    
            LocalContainerEntityManagerFactoryBean emf = builder
                .dataSource(partnerDataSource())
                .packages(TestPost.class)
                .persistenceUnit("partner")
                .build();
            emf.setJpaProperties(properties);
            return emf;
        }
    
        @Bean(name = "partnerTransactionManager")
        public JpaTransactionManager db2TransactionManager(@Qualifier("partnerEntityManagerFactory") final EntityManagerFactory emf) {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(emf);
            return transactionManager;
        }
    }
    

    JHipster 配置的默认数据源将继续使用它的实体。对于使用第二个数据源的自定义实体,这里是存储库配置:

    @SuppressWarnings("unused")
    @Repository
    @Transactional("partnerTransactionManager")
    @PersistenceContext(name = "partnerEntityManagerFactory")
    public interface TestPostRepository extends  JpaRepository<TestPost,Long>{
    }
    

    【讨论】:

    • 您能否解释一下创建 JpaTransactionManager、LocalContainerEntityManagerFactoryBean 的原因以及您是如何提出这个解决方案的。谢谢。 @freemanpolys
    • 我找不到配置文件的位置。请提及位置/路径。
    • 在类 DatabaseConfiguration.java 中
    • @freemanpolis 下面是我在运行应用程序时遇到的错误*************************** APPLICATION FAILED TO START *************************** Description: Failed to bind properties under 'spring.datasource.type' to java.lang.Class&lt;javax.sql.DataSource&gt;: Property: spring.datasource.type Value: com.zaxxer.hikari.HikariDataSource Origin: class path resource [config/application-dev.yml]:27:15 Reason: No converter found capable of converting from type [java.lang.String] to type [java.lang.Class&lt;javax.sql.DataSource&gt;]
    • 请注意,我必须将 auto-commit: false 添加到合作伙伴数据源(对于 Oracle),以防其他人也遇到问题
    【解决方案2】:

    我发现@freemanpolys 的回答很好,但如果您希望它与 postGres 一起使用,它需要一个额外的属性。

    将以下属性添加到默认和辅助数据源:

    autocommit: false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2020-01-30
      • 2018-04-12
      • 2015-09-01
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多