Spring多数据源没有读取某些应用程序属性

时间:2017-10-09 22:12:09

标签: java tomcat spring-boot datasource

我挣扎了一个多星期的事情。问题是我需要2个数据源,因为我的应用程序有自己的数据库,但还需要检索另一个数据库的信息。

首先,我决定与2个数据库进行通信,这些数据库在开始时遇到了问题,但现在有时当应用程序尝试连接到其中一个数据库时,使用jdbcTemplate的数据库可能会在1小时或更短时间后关闭连接并获得异常,不再可以建立连接。我想从tomcat池中配置一些属性将有助于解决这个问题,但这些问题并没有被数据源读取。所以这是我的应用程序属性和数据库配置类,以澄清所有这些东西。

应用程序属性:

spring.datasource.url=jdbc:postgresql://localhost:5433/firstDB
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.username=user1
spring.datasource.password=password1
spring.jpa.hibernate.show_sql=true
spring.jpa.hibernate.format_sql=true
spring.jpa.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.hibernate.dialect=org.hibernate.dialect.PostgreSQL92Dialect
spring.jpa.hibernate.ddl-auto=update

# --------------------
# CONFIGURACION SECOND
# --------------------

spring.sia.datasource.url=jdbc:postgresql://192.168.1.202:5432/secondDB
spring.sia.datasource.tomcat.remove-abandoned=true
spring.sia.datasource.tomcat.initial-size=20
spring.sia.datasource.driver-class-name=org.postgresql.Driver
spring.sia.datasource.username=user2
spring.sia.datasource.password=password2

的DBConfig:

@Configuration
public class DbConfig {

    @Bean(name="firstDb")
    @Primary
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource firstDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.sia.datasource")
    public DataSourceProperties secondDataSourceProperties(){
        return new DataSourceProperties();
    }

    @Bean(name="siaDb")
    public DataSource secondDataSource() {        
        return secondDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean(name="siaJdbcTemplate")
    public JdbcTemplate jdbcTemplate(@Qualifier("siaDb") DataSource dataSource) {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        jdbcTemplate.setResultsMapCaseInsensitive(true);

        return jdbcTemplate;
    }

}

问题在于属性:

spring.sia.datasource.tomcat.remove-abandoned=true
spring.sia.datasource.tomcat.initial-size=20

没有读过第二个数据源,也许我错过了配置类的东西。

我是否需要创建手动数据源?如果是这样,那么 @ConfigurationProperties 注释以及对数据源构建器的调用是什么意思?

我会感谢您的所有帮助,因为我需要首先弄清楚tomcat池化属性是否解决了这个问题,或者可能是不同的。

这是尝试命中应用程序端点后发生的异常。

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:342) ~[spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:366) ~[spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:212) ~[spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:726) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:776) [spring-jdbc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at com.swargos.api.repositories.ServicioSiaRepositoryImpl.getAllServiciosByUsuario(ServicioSiaRepositoryImpl.java:112) [classes!/:na]
    at com.swargos.api.repositories.ServicioSiaRepositoryImpl$$FastClassBySpringCGLIB$$f87228d2.invoke(<generated>) [classes!/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) [spring-core-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) [spring-aop-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) [spring-tx-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) [spring-aop-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at com.swargos.api.repositories.ServicioSiaRepositoryImpl$$EnhancerBySpringCGLIB$$a929bedc.getAllServiciosByUsuario(<generated>) [classes!/:na]
    at com.swargos.api.services.ServicioSiaServiceImpl.findServiciosByUsuario(ServicioSiaServiceImpl.java:37) [classes!/:na]
    at com.swargos.api.controllers.ServicioSiaController.getServiciosCurrentUser(ServicioSiaController.java:54) [classes!/:na]
    at sun.reflect.GeneratedMethodAccessor98.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) [spring-web-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [javax.servlet-api-3.1.0.jar!/:3.1.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]

由于

1 个答案:

答案 0 :(得分:0)

这些错误可能非常难以解决。你能发布你得到的例外的堆栈跟踪吗?

首先,您可以尝试为两个数据源提供tomcat连接属性并进行检查。

我最近为一个项目创建了2个数据源,并为两个数据源提供了tomcat连接属性。

db1.database.maximumPoolSize=100
db1.database.connectionTimeout=30000
db1.database.validationTimeout=5000
db1.database.idleTimeout=60000
db1.database.leakDetectionThreshold=400000
db1.database.maxLifetime=600000
db1.database.minIdle=-1
db1.database.poolName=hikari-app
db1.database.isRegisterMbeans=true

db2.database.maximumPoolSize=100
db2.database.connectionTimeout=30000
db2.database.validationTimeout=5000
db2.database.idleTimeout=60000
db2.database.leakDetectionThreshold=400000
db2.database.maxLifetime=600000
db2.database.minIdle=-1
db2.database.poolName=hikari-app2
db2.database.isRegisterMbeans=true