我的基于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风格"方法或我是否需要手动配置每个模板?
答案 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;
}
这应该是配置数据源的技巧。