【发布时间】:2018-05-19 18:42:22
【问题描述】:
我在我的应用程序中使用 Hibernate ORM 和 PostgreSQL,有时我使用批处理操作。 起初我不明白为什么在批处理大小 = 25 的日志中会生成 25 个查询,起初我认为它无法正常工作。 但是之后我查看了pg驱动的源码,发现在PgStatement类中有以下几行:
public int[] executeBatch() throws SQLException {
this.checkClosed();
this.closeForNextExecution();
if (this.batchStatements != null && !this.batchStatements.isEmpty()) {
this.transformQueriesAndParameters();
//confuses next line, because we have array of identical queries
Query[] queries = (Query[])this.batchStatements.toArray(new Query[0]);
ParameterList[] parameterLists =
(ParameterList[])this.batchParameters.toArray(new ParameterList[0]);
this.batchStatements.clear();
this.batchParameters.clear();
在 PgPreparedStatement 类中
public void addBatch() throws SQLException {
checkClosed();
if (batchStatements == null) {
batchStatements = new ArrayList<Query>();
batchParameters = new ArrayList<ParameterList>();
}
batchParameters.add(preparedParameters.copy());
Query query = preparedQuery.query;
//confuses next line
if (!(query instanceof BatchedQuery) || batchStatements.isEmpty()) {
batchStatements.add(query);
}
}
我注意到,如果批次的大小变为 25, 发送了 25 个带有附加参数的查询。
数据库的日志证实了这一点,例如:
2017-12-06 01:22:08.023 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ: выполнение S_3: BEGIN
2017-12-06 01:22:08.024 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ: выполнение S_4: select nextval ('tests_id_seq')
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ: выполнение S_2: insert into tests (name, id) values ($1, $2)
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory ПОДРОБНОСТИ: параметры: $1 = 'test', $2 = '1'
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ: выполнение S_2: insert into tests (name, id) values ($1, $2)
2017-12-06 01:22:08.041 MSK [18402] postgres@buzzfactory ПОДРОБНОСТИ: параметры: $1 = 'test', $2 = '2'
...
x23 queries with parameters
...
2017-12-06 01:22:08.063 MSK [18402] postgres@buzzfactory СООБЩЕНИЕ: выполнение S_5: COMMIT
但我认为必须使用一组 25 个参数执行一个查询。 或者我不明白批量插入如何与准备好的语句一起工作? 为什么要重复一个查询 n 次?
毕竟,我试图在这个地方调试我的查询
if (!(query instanceof BatchedQuery) || batchStatements.isEmpty()) {
并注意到我的查询始终是 SimpleQuery 的实例,而不是 BatchedQuery。也许这是解决问题的方法?我找不到有关 BatchedQuery 的信息
【问题讨论】:
-
这可能是你最好在 postgresql-jdbc 邮件列表中提出的问题。
标签: java postgresql hibernate jdbc