【发布时间】:2012-06-23 06:39:12
【问题描述】:
我有一个奇怪的问题,涉及使用 JDBC 将大量数据放入 PostgSQL 数据库的 executeBatch 和 Prepared Statements。我每次使用 executeBatch 向数据库发送 50,000 条语句。
我知道执行批处理和准备好的语句正在工作;一些数据正在进入数据库。 准备好的语句是
INSERT INTO time ( time_id, log_id, phenomenon_time, qc_phenomenon_time )
SELECT nextval( 'time_seq' ), ?, ?, ?
将其与执行批处理一起使用,可以在数据库中找到数据。
当使用以下准备好的语句时,
INSERT INTO result_3d ( result_3d_id, time_id, variable_id, value, qc_value )
SELECT nextval( 'result_3d_seq' ), ( SELECT t.time_id
FROM time t
WHERE t.log_id = ?
AND t.phenomenon_time = ? ), ?, ?, ?
执行批处理后,数据库中没有数据。我什至打开了数据库日志记录,发现第一个的所有内容,但第二个什么都没有。第二个准备好的语句依赖于第一个的数据,但数据库甚至没有看到第二个。
没有抛出异常。唯一奇怪的是,对于第二个准备好的语句,返回的数组的大小为零。执行批处理立即返回。第二个准备好的语句中的子查询是否允许?
我使用 postgres-9.1-901.jdbc4.jar 作为 PostgreSQL v8.3.19 数据库的 JDBC 驱动程序。
请帮忙。
【问题讨论】:
-
set log_statement = 'all'在 postgresql.conf 中并重新启动/重新加载 Pg,如果您还没有的话。将loglevel = 2添加到您在创建连接时传递的PgJDBC 参数中。然后检查 PgJDBC 日志(通过您现有的任何 java 日志记录)和 Pg 日志(在 datadir 中的pg_log或/var/log/中)。 -
更多信息也会有所帮助:在针对该数据库测试旧 PgJDBC 时也会发生这种情况吗?在针对当前 Pg 测试新的 PgJDBC 时怎么样?您需要测试这些配置以隔离故障。
标签: java postgresql jdbc