使用Spring Boots application.properties优化JDBC获取大小

时间:2016-01-14 12:05:49

标签: spring oracle jdbc spring-boot jdbctemplate

我的基于Spring Boot 1.3.1的应用程序依赖于Oracle 11.2数据库,我想调整SELECT语句结果的获取。

JdbcTemplate提供public void setFetchSize(int fetchSize)来调整获取大小,驱动程序将Oracle预设为10

  

设置此JdbcTemplate的获取大小。这很重要   处理大型结果集:将其设置为高于默认值   值将以内存为代价提高处理速度   消费;设置此值可以避免传输行数据   应用程序永远不会读取。默认值为-1,表示为   使用JDBC驱动程序的默认值(即不传递特定的提取大小   设置驱动程序)。

Oracle JDBC驱动程序(我使用ojdbc7.jar,因为它向下兼容)提供defaultRowPrefetch参数来增加完整数据库连接的提取大小。

根据the docs,此参数可以这样设置:

java.util.Properties info = new java.util.Properties();
info.put ("user", "scott");
info.put ("password","tiger");
info.put ("defaultRowPrefetch","15");
getConnection ("jdbc:oracle:oci8:@",info);

但我的应用程序是使用application.yml配置的:

datasource:
    url: jdbc:oracle:thin:@xyz:1521:abc
    username: ${name}
    password: ${password}
    driver-class-name: oracle.jdbc.driver.OracleDriver
    ...

即使我想更改该配置以使用spring.datasource.url=jdbc:...,也无法根据this post全局设置提取大小。

是否有更多" Spring Boot风格"方法或我是否需要手动配置每个模板?

1 个答案:

答案 0 :(得分:3)

BeanPostProcessor将处理ApplicationContext中的所有bean,这样您就可以添加其他配置或完全替换它,如果您愿意的话。

您可以创建一个BeanPostProcessor,将属性添加到已配置的DataSource。如果您相应地使用不同的commons-dbcp修改,则下面的示例假定使用DataSource 1或2。

public class DataSourceConfiguringBeanPostProcessor implements BeanPostProcessor {
    private final Map<String,String> properties = new HashMap<>;

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instance BasicDataSource ) { 
            for (Map.Entry<String, String> prop : properties.entrySet()) {
                ((BasicDataSource) bean).addConnectionProperty(prop.getKey(), prop.getValue());
            }
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public void setProperties(Map<String, String> properties) {
        this.properties.putAll(properties);
    }
}

现在您可以将其添加到您的配置中,它会将属性添加到DataSource bean。

@Bean
public BeanPostProcessor dataSourcePostProcessor() {
    DataSourceConfiguringBeanPostProcessor processor = new DataSourceConfiguringBeanPostProcessor();
    Map<String, String> properties = new HashMap<>();
    properties.put("defaultRowPrefetch", "15");
    properties.put("defaultBatchValue", "25");
    processor.setProperties(properties);
    return processor;
}

这应该是配置数据源的技巧。