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; 
  • 您是对的,通过我们以批处理的方式执行,Oracle将在数据库上执行N次更新

  • <>您是否考虑过通过选择+存储过程通过创建表进行批量收集/更新? ex-
    创建表Foo2,从Foo中选择c1、c2、c3
    现在删除Foo并将Foo2重命名为Foo table

    有关更多信息,请参阅下面的链接


    使用标准JDBC批处理似乎不会减少往返次数,请参阅 :

    标准更新批处理的Oracle实现没有 为泛型语句和可调用语句实现真正的批处理 声明。尽管Oracle JDBC支持使用标准 对语句和CallableStatement对象进行批处理,不太可能 看到性能的提高


    您是否尝试过同一文档中解释的他们自己的“Oracle更新批处理”?

    那么您能提供一个代码示例吗?这听起来像是INSERT中使用的FORALL,但我无法通过“批量”更新使其正确运行ID和日期的来源是什么?如果您可以轻松地将它们放入Oracle中的一个表中,那么您的批量更新可以简化为一个update语句。@GriffeyDog这些ID和日期的来源是来自第三方的。如果是平面文件,理想情况下您可以使用它将数据放入一个表中,就像我上面提到的那样。