Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring中将tomcat连接池属性添加到自定义数据源?_Java_Spring_Tomcat_Spring Boot - Fatal编程技术网

Java 如何在Spring中将tomcat连接池属性添加到自定义数据源?

Java 如何在Spring中将tomcat连接池属性添加到自定义数据源?,java,spring,tomcat,spring-boot,Java,Spring,Tomcat,Spring Boot,我希望在我的应用程序中有多个数据源。因此,不能依赖Spring的数据源自动配置,必须创建我自己的,如下所示: @Bean @Primary @ConfigurationProperties("spring.datasource.custom") public DataSource primaryDataSource() { return DataSourceBuilder.create().build();

我希望在我的应用程序中有多个
数据源。因此,不能依赖Spring的数据源自动配置,必须创建我自己的,如下所示:

        @Bean
        @Primary
        @ConfigurationProperties("spring.datasource.custom")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }

spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver

#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSourceProperties primaryDataSourceProperties() {
     return new DataSourceProperties;
}

@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom.tomcat")
public DataSource primaryDataSource() {
     return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
问题:未自动拾取
.tomcat.
属性


问题:如何将它们放入
数据源中?

您需要创建多个数据源bean,其中一个是
@Primary
,您可以像这样设置tomcat连接池属性

@Value("${spring.datasource.custom.tomcat.validation-query}")
private String validationQuery;

@Value("${spring.datasource.custom.tomcat.test-on-borrow}")
private boolean onBorrow;

    org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
    ds.setValidationQuery(validationQuery);
    ds.setTestOnBorrow(onBorrow);

而不是
返回DataSourceBuilder.create().build()您需要返回您在上面创建的数据源

我通过org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Tomcat类查看spring boot是如何实现的,这非常简单

例如:

@Bean
@Primary // or @Qualifier("foobar")
@ConfigurationProperties("foobar.datasource")
DataSourceProperties foobarDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary // or @Qualifier("foobar")
@ConfigurationProperties("foobar.datasource.tomcat")
public org.apache.tomcat.jdbc.pool.DataSource foobarDataSource(DataSourceProperties properties) {
    org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);
    DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
    String validationQuery = databaseDriver.getValidationQuery();
    if (validationQuery != null) {
        dataSource.setTestOnBorrow(true);
        dataSource.setValidationQuery(validationQuery);
    }
    return dataSource;
}

@SuppressWarnings("unchecked")
protected <T> T createDataSource(/*@Qualifier("foobar")*/ DataSourceProperties properties, Class<? extends DataSource> type) {
    return (T) properties.initializeDataSourceBuilder().type(type).build();
}
@Bean
@主//或@Qualifier(“foobar”)
@ConfigurationProperties(“foobar.datasource”)
数据源属性foobarDataSourceProperties(){
返回新的数据源属性();
}
@豆子
@主//或@Qualifier(“foobar”)
@ConfigurationProperties(“foobar.datasource.tomcat”)
public org.apache.tomcat.jdbc.pool.DataSource foobarDataSource(DataSourceProperties属性){
org.apache.tomcat.jdbc.pool.DataSource DataSource=createDataSource(属性,org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver DatabaseDriver=DatabaseDriver.fromJdbcUrl(properties.determineUrl());
String validationQuery=databaseDriver.getValidationQuery();
if(validationQuery!=null){
dataSource.settstonbrow(true);
setValidationQuery(validationQuery);
}
返回数据源;
}
@抑制警告(“未选中”)

受保护的T createDataSource(/*@Qualifier(“foobar”)*/DataSourceProperties属性,类,在application.properties中具有以下行:

spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.custom.type=org.apache.tomcat.jdbc.pool.DataSource

#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
您的配置bean应该如下所示:

        @Bean
        @Primary
        @ConfigurationProperties("spring.datasource.custom")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }

spring.datasource.custom.url=jdbc:mysql://localhost/tablename
spring.datasource.custom.username=root
spring.datasource.custom.password=rootpw
spring.datasource.custom.driver-class-name=com.mysql.jdbc.Driver

#the important part:
spring.datasource.custom.tomcat.test-on-borrow=true
spring.datasource.custom.tomcat.validation-query=SELECT 1
@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom")
public DataSourceProperties primaryDataSourceProperties() {
     return new DataSourceProperties;
}

@Bean
@Primary
@ConfigurationProperties("spring.datasource.custom.tomcat")
public DataSource primaryDataSource() {
     return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}

我当前的Spring启动版本是1.5.18,但是我不能仅仅依靠配置的
Spring.datasource.custom.tomcat=
属性吗?例如,如果我添加了连接池属性,比如
Spring.datasource.custom.tomcat.max active=
,对于默认的数据源,Spring会自动获取那些tomcat属性。H我现在如何将这些属性分配给我的自定义数据源?我的意思是,在自动配置期间依赖单个数据源时,spring autoconfigure如何将这些tomcat属性添加到ds?您可以自动连接这些属性(使用
@Value
)在创建数据源并使用这些数据源的bean中。只有在使用默认数据源且属性与spring指定的完全匹配时,Springboot才会选择值。如果创建类似spring.datasource.custom.tomcat.max-activeOk这样的属性,spring将不会选择。您知道在哪里可以找到spring auto-con吗在正常的自动配置启动过程中读取
.tomcat*
属性的配置?因此,也许我可以继承或复制粘贴它们使用的代码。检查
DataSourceAutoConfiguration
Spring似乎是通过反射在
AbstractPropertyAccessor.setPropertyValues()内设置tomcat属性
。因此,可能唯一的机会就是通过
@Value'注入参数,并在tomcat
数据源上显式设置它们。。。