Spring Boot Dual数据配置,连接丢失后无法重新连接

时间:2018-12-14 08:58:11

标签: spring postgresql spring-boot spring-data-jpa spring-data

所有人。我正在使用Spring Boot 1.5.3编写的应用程序。我有两个数据源,其配置如下。

主要连接

spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://xxx.xxx.xxx.xx:5432/mydb
spring.datasource.username = xxxx
spring.datasource.password = xxxx

spring.jpa.properties.hibernate.default_schema=test
# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000
# Maximum number of active connections that can be allocated from this pool at the same time.
spring.datasource.tomcat.max-active=150
spring.datasource.tomcat.max-idle=30
spring.datasource.tomcat.min-idle=2
spring.datasource.tomcat.initial-size=3
# Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.test-on-connect=true
spring.datasource.time-between-eviction-runs-millis=60000
#spring.datasource.tomcat.validation-query-timeout=1000
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=1000
spring.datasource.tomcat.remove-abandoned=true
spring.datasource.tomcat.remove-abandoned-timeout=55
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.min-evictable-idle-time-millis = 55000
spring.datasource.tomcat.time-between-eviction-runs-millis = 34000

第二次连接

 spring.rdatasource.driverClassName = org.postgresql.Driver
    spring.rdatasource.url = jdbc:postgresql://xxx.xxx.xxx.xx:5432/mydb1
    spring.rdatasource.username = xxxx
    spring.rdatasource.password = xxxx

    spring.jpa.properties.hibernate.default_schema=test
    # Number of ms to wait before throwing an exception if no connection is available.
    spring.rdatasource.tomcat.max-wait=10000
    # Maximum number of active connections that can be allocated from this pool at the same time.
    spring.rdatasource.tomcat.max-active=150
    spring.rdatasource.tomcat.max-idle=30
    spring.rdatasource.tomcat.min-idle=2
    spring.rdatasource.tomcat.initial-size=3
    # Validate the connection before borrowing it from the pool.
    spring.rdatasource.tomcat.test-on-borrow=true
    spring.rdatasource.tomcat.test-on-connect=true
    spring.rdatasource.time-between-eviction-runs-millis=60000
    #spring.rdatasource.tomcat.validation-query-timeout=1000
    spring.rdatasource.tomcat.validation-query=SELECT 1
    spring.rdatasource.tomcat.validation-interval=1000
    spring.rdatasource.tomcat.remove-abandoned=true
    spring.rdatasource.tomcat.remove-abandoned-timeout=55
    spring.rdatasource.tomcat.test-while-idle=true
    spring.rdatasource.tomcat.min-evictable-idle-time-millis = 55000
    spring.rdatasource.tomcat.time-between-eviction-runs-millis = 34000

我正在VPN环境中工作。当我运行应用程序时,应用程序运行正常。但是问题开始于当我断开VPN并重新连接VPN时。再次,我的应用程序不会再次重新连接到数据源。相反,我总是例外。

但是当将连接处理留给spring本身时我只工作单个数据库,而我不执行任何数据库配置。

请帮助我。我将提供其他所需信息。

更新

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
    basePackages = {"com.services.persistence"}, 
    entityManagerFactoryRef = "entityManager", 
    transactionManagerRef = "transactionManager"
)
@ComponentScan("com.services.persistence")
@EnableTransactionManagement
public class DBConfig {

    @Autowired private Environment env;

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManager() {
        LocalContainerEntityManagerFactoryBean em
          = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(userDataSource());
        em.setPackagesToScan(
          new String[] { "com.services.persistence", "com.services.persistence.pojo" });

        HibernateJpaVendorAdapter vendorAdapter
          = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
//        properties.put("hibernate.hbm2ddl.auto",
//          env.getProperty("hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
          env.getProperty("spring.jpa.database-platform"));
        properties.put("hibernate.current_session_context_class",
                env.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));

        em.setJpaPropertyMap(properties);

        return em;
    }

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource userDataSource() {
        return DataSourceBuilder
                .create()
                .build();
    }

    @Primary
    @Bean
    public JpaTransactionManager transactionManager() {

        JpaTransactionManager transactionManager
          = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
          entityManager().getObject());
        return transactionManager;
    }

    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory() {
      SessionFactory sessionFactory = transactionManager().getEntityManagerFactory().unwrap(SessionFactory.class);

        if (sessionFactory == null) {
            throw new NullPointerException("factory is not a hibernate factory");
        } else {
            System.out.println(
                    "==================================== Transaction Enabled ========================================");
            return sessionFactory;
        }
    }

我还配置了spring.rdatasource,它与上面的文件相同,除了未将其设置为主要内容以及诸如pojo,transactionmanager等其他详细信息。

0 个答案:

没有答案