Spring Boot 如何为 Hikari 池和 jdbcTemplate 设置连接获取大小
SpringBoot how to set connection fetch size for Hikari Pool and jdbcTemplate
我正在寻找方法
- 为 Spring 数据源配置 Hikari 连接池
- 明确设置 resultSet 的 fetchSize。
这是我的 application.properties
# Datasource
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:postgresql://mydb
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.driverClassName=org.postgresql.Driver
#Hikari
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.auto-commit=true
这是我的服务代码
@Service
@RequiredArgsConstructor
public class PerfService {
private final JdbcTemplate template;
public RowCountResponse getData(String param) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = Objects.requireNonNull(template.getDataSource()).getConnection();
preparedStatement = connection.prepareStatement("SELECT whatever");
preparedStatement.setFetchSize(30000); // !!!
preparedStatement.setString(1, param);
ResultSet resultSet = preparedStatement.executeQuery();
int rowCount = 0;
while (resultSet.next()) {
rowCount++;
}
resultSet.close();
return new RowCountResponse()
.setRowCount(rowCount);
} catch (Exception e) {
throw new RuntimeException("Error while fetching rows", e);
} finally {
JdbcUtils.closeStatement(preparedStatement);
DataSourceUtils.releaseConnection(connection, template.getDataSource());
}
}
}
- 我的游泳池好像漏水了。我没有 return 正确连接到池。
- 有没有更优雅的方式来使用
jdbcTemplate
和preparedStatement.setFetchSize(30000);
您可以使用连接参数defaultRowFetchSize
,参见the documentation。
对不起,迟到了,但可能会帮助别人。
设置 fetchSize 时 postgresql 出现问题 - https://github.com/spring-projects/spring-framework/issues/24848
为了工作,您还必须为您的连接设置 autoCommit=false,因此在您的示例中它将是:
spring.datasource.hikari.auto-commit=false
但是将连接池的自动提交设置为 false 可能会带来不便,因此一种解决方法是拥有两个连接池 - 一个只读,autoCommit=false,第二个(普通)autoCommit=true。
JdbcTemplate 也有 setFetchSize 方法,所以你可以简单地做
template.setFetchSize(30000);
我正在寻找方法
- 为 Spring 数据源配置 Hikari 连接池
- 明确设置 resultSet 的 fetchSize。
这是我的 application.properties
# Datasource
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:postgresql://mydb
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.driverClassName=org.postgresql.Driver
#Hikari
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.auto-commit=true
这是我的服务代码
@Service
@RequiredArgsConstructor
public class PerfService {
private final JdbcTemplate template;
public RowCountResponse getData(String param) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = Objects.requireNonNull(template.getDataSource()).getConnection();
preparedStatement = connection.prepareStatement("SELECT whatever");
preparedStatement.setFetchSize(30000); // !!!
preparedStatement.setString(1, param);
ResultSet resultSet = preparedStatement.executeQuery();
int rowCount = 0;
while (resultSet.next()) {
rowCount++;
}
resultSet.close();
return new RowCountResponse()
.setRowCount(rowCount);
} catch (Exception e) {
throw new RuntimeException("Error while fetching rows", e);
} finally {
JdbcUtils.closeStatement(preparedStatement);
DataSourceUtils.releaseConnection(connection, template.getDataSource());
}
}
}
- 我的游泳池好像漏水了。我没有 return 正确连接到池。
- 有没有更优雅的方式来使用
jdbcTemplate
和preparedStatement.setFetchSize(30000);
您可以使用连接参数defaultRowFetchSize
,参见the documentation。
对不起,迟到了,但可能会帮助别人。
设置 fetchSize 时 postgresql 出现问题 - https://github.com/spring-projects/spring-framework/issues/24848
为了工作,您还必须为您的连接设置 autoCommit=false,因此在您的示例中它将是:
spring.datasource.hikari.auto-commit=false
但是将连接池的自动提交设置为 false 可能会带来不便,因此一种解决方法是拥有两个连接池 - 一个只读,autoCommit=false,第二个(普通)autoCommit=true。
JdbcTemplate 也有 setFetchSize 方法,所以你可以简单地做
template.setFetchSize(30000);