Java Informix JBDC在提交上保留游标

Java Informix JBDC在提交上保留游标,java,jdbc,cursor,informix,Java,Jdbc,Cursor,Informix,使用Informix 12.10FC5DE和JDBC.4.10.JC5DE,我试图编写一个Java程序,在表上执行“受控”删除。 包含该表的数据库将被记录,并且该表具有“锁定模式行”。 程序将接收最多要删除的行数,并每隔X行执行定期提交(以限制锁的数量并防止长事务) 使用SPL,我可以使用hold声明一个游标,并使用“delete where current of”执行foreach循环 使用JDBC,我可以使用resultSet方法.next()和.deleteRow()来执行我想要的操作(我

使用Informix 12.10FC5DE和JDBC.4.10.JC5DE,我试图编写一个Java程序,在表上执行“受控”删除。 包含该表的数据库将被记录,并且该表具有“锁定模式行”。 程序将接收最多要删除的行数,并每隔X行执行定期提交(以限制锁的数量并防止长事务)

使用SPL,我可以使用hold声明一个游标,并使用“delete where current of”执行foreach循环

使用JDBC,我可以使用
resultSet
方法
.next()
.deleteRow()
来执行我想要的操作(我将连接和语句设置为不自动提交或在提交时关闭resultSet)。 它可以工作,但速度很慢(在后台,JDBC发送类似“DELETE FROM TABLE WHERE COLUMN=?”的内容)

我的代码类似于以下代码:

Class.forName("com.informix.jdbc.IfxDriver");
Connection conn = DriverManager.getConnection(url);
conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
conn.setAutoCommit(false);

String cmd = "SELECT id FROM teste_001 FOR UPDATE;";
Statement stmt = conn.createStatement(
                ResultSet.TYPE_FORWARD_ONLY,
                ResultSet.CONCUR_UPDATABLE,
                ResultSet.HOLD_CURSORS_OVER_COMMIT);
stmt.setFetchSize(100);
stmt.setCursorName("myowncursor");

ResultSet resultados = stmt.executeQuery(cmd);  // Get the resulSet and cursor

int maximo = 2000;
int passo = 100;
int cTotal = 0;
int cIter = 0;

cmd2 = "DELETE FROM teste_001 WHERE CURRENT OF " +
         resultados.getCursorName();
PreparedStatement stmtDel2 = conn.prepareStatement(cmd2);

while (resultados.next())
{
    if (cIter < maximo)
    {
        int resultCode2 = stmtDel2.executeUpdate();
        if (resultCode2 == 1)
        {
            cTotal++;
        }
        cIter++;
        if ((cIter % passo) == 0)
        {
            conn.commit();  // Perform periodic commit
        }
    }
    else
    {
        break;  // maximum number of rows reached 
    }
}
conn.commit();  // Perform final commit

stmtDel2.close();
resultados.close();
stmt.close();
conn.close();
即使我设置了“HOLD\u CURSORS\u OVER\u COMMIT”,光标似乎也被关闭了

有人知道我在JDBC上的尝试是否可行吗

编辑:
由于informix支持IBM DRDA协议,我在测试informix实例上配置了一个DRDA侦听器,并使用DB2UDBJDBC通用驱动程序。 代码基本相同,只是驱动程序发生了变化:

Class.forName("com.ibm.db2.jcc.DB2Driver");
使用DRDA驱动程序,光标在提交上保持打开状态,程序的行为符合预期。在informix实例上跟踪会话时,我会得到以下类型的语句:

DELETE FROM test_001 WHERE CURRENT OF SQL_CURSH600C1

因此,informix确实支持DRDA驱动程序的“HOLD_CURSORS_OVER_COMMIT”,但我仍然无法让它与“ifxDriver”一起工作。

不要发出提交,很多数据库服务器在提交时关闭服务器端游标,即使JDBC端由于
HOLD_CURSORS_OVER_COMMIT
而保持客户端游标打开,在这种情况下(通常情况下),行在执行提交之前缓存在客户端。还要注意的是,当fetch大小为100时,服务器端的游标可能最多提前99行,这可能意味着您删除了错误的行。目标是发出提交。我可以在不使用for update游标的情况下迭代
resultSet
HOLD\u CURSORS\u OVER\u COMMIT
对于许多数据库来说,是在执行提交之前通过客户端技巧(例如将游标中的所有行复制到客户端缓存)实现的。如果您想使用服务器端游标,那么对于这些数据库,在您真正完成之前不应该提交(根据您的描述,这显然也适用于informix)。@Mark I使用其他驱动程序的结果更新我的问题,并且informix似乎确实支持服务器端
HOLD\u CURSORS\u OVER\u commit
。这让我想知道我是否没有正确使用JDBC.4.10.JC5DE驱动程序,或者它是否真的不受支持。驱动程序的文档没有明确说明这一点(至少对我来说不清楚)。不要发出提交,很多数据库服务器在提交时关闭服务器端游标,即使JDBC端由于
HOLD\u CURSORS\u OVER\u commit
而保持客户端游标打开,在这种情况下(通常情况下),行在执行提交之前缓存在客户端。还要注意的是,当fetch大小为100时,服务器端的游标可能最多提前99行,这可能意味着您删除了错误的行。目标是发出提交。我可以在不使用for update游标的情况下迭代
resultSet
HOLD\u CURSORS\u OVER\u COMMIT
对于许多数据库来说,是在执行提交之前通过客户端技巧(例如将游标中的所有行复制到客户端缓存)实现的。如果您想使用服务器端游标,那么对于这些数据库,在您真正完成之前不应该提交(根据您的描述,这显然也适用于informix)。@Mark I使用其他驱动程序的结果更新我的问题,并且informix似乎确实支持服务器端
HOLD\u CURSORS\u OVER\u commit
。这让我想知道我是否没有正确使用JDBC.4.10.JC5DE驱动程序,或者它是否真的不受支持。驱动程序的文档没有明确说明这一点(至少,我不清楚)。
DELETE FROM test_001 WHERE CURRENT OF SQL_CURSH600C1