Java Oracle和JDBC计算事务期间发生的执行次数及其性能
我有以下代码:Java Oracle和JDBC计算事务期间发生的执行次数及其性能,java,sql,performance,oracle,jdbc,Java,Sql,Performance,Oracle,Jdbc,我有以下代码: void updateRecords(long[] ids, Timestamp[] dates, Connection connection { PreparedStatement statement = connection.prepareStatement( "Update Foo set date = ? where id = ?"); for(int i =0; i < ids.length;i
void updateRecords(long[] ids, Timestamp[] dates, Connection connection
{
PreparedStatement statement = connection.prepareStatement(
"Update Foo set date = ? where id = ?");
for(int i =0; i < ids.length;i++)
{
statement.setTimestamp(1,dates[i]);
statement.setLong(2,ids[i]);
statement.addBatch();
if(i %25000 == 0)
{
statement.executeBatch();
statement.clearBatch();
}
}
statement.executeBatch();
}
void updateRecords(长[]ID、时间戳[]日期、连接
{
PreparedStatement语句=connection.prepareStatement(
“更新Foo集合日期=?其中id=?”;
for(int i=0;i
这方面的性能非常糟糕,100万次更新需要2个多小时。因此,在我的多部分问题中:
1) Oracle上执行了多少条语句?2) 如何提高Oracle上执行的语句数量,以减少执行100万次更新所需的时间 这是Oracle 10g和Java 6 我想这会执行N条语句,其中N是id的长度。是的,oracle将执行与id数量相同的语句 2) 对于这种情况,最好的办法是通过一次调用将日期发送到数据库,然后使用存储过程进行更新。例如,可以将ID和时间戳作为数组发送,然后在存储过程中重新创建逻辑。此外,根据您的数据库结构和配置,在存储过程中每隔一段时间运行一次提交操作可能会提高性能(假设您的操作不需要原子化) 你可以看到一个例子。只需更改类型以符合您的要求,而不是执行插入,而是在存储过程中执行更新:
forall i in 1.. example.count
update Foo set date = treat(example(i) as T_TYPE).DATE where id = treat(example(i) as T_TYPE).ID;
end;
创建表Foo2,从Foo中选择c1、c2、c3代码>
现在删除Foo并将Foo2重命名为Foo table
有关更多信息,请参阅下面的链接
使用标准JDBC批处理似乎不会减少往返次数,请参阅
:
标准更新批处理的Oracle实现没有
为泛型语句和可调用语句实现真正的批处理
声明。尽管Oracle JDBC支持使用标准
对语句和CallableStatement对象进行批处理,不太可能
看到性能的提高
您是否尝试过同一文档中解释的他们自己的“Oracle更新批处理”?那么您能提供一个代码示例吗?这听起来像是INSERT中使用的FORALL,但我无法通过“批量”更新使其正确运行ID和日期的来源是什么?如果您可以轻松地将它们放入Oracle中的一个表中,那么您的批量更新可以简化为一个update语句。@GriffeyDog这些ID和日期的来源是来自第三方的。如果是平面文件,理想情况下您可以使用它将数据放入一个表中,就像我上面提到的那样。