Java wifi中的批处理Sql插入器不稳定连接建议

Java wifi中的批处理Sql插入器不稳定连接建议,java,sql,oracle,jdbc,insert,Java,Sql,Oracle,Jdbc,Insert,我有一个Java代码,用于从文本文件在数据库中插入许多sql行。 我用setAutoCommit(false)对连接进行了编程,然后在最后,如果没有发生错误(检测到所有方法都可以抛出),我发送提交。 这项任务通常需要30分钟 它在电缆连接中工作得非常好,但在wifi连接中,它永远不会到达终点,因为连接有时会在短时间内丢失 为了解决它。我编写了两个程序:将文本文件的行转换为一个序列化对象,该对象包含ArrayList中的所有行;我创建了另一个序列化对象,该对象具有int索引,保存成功插入的最后一行

我有一个Java代码,用于从文本文件在数据库中插入许多sql行。 我用setAutoCommit(false)对连接进行了编程,然后在最后,如果没有发生错误(检测到所有方法都可以抛出),我发送提交。 这项任务通常需要30分钟

它在电缆连接中工作得非常好,但在wifi连接中,它永远不会到达终点,因为连接有时会在短时间内丢失

为了解决它。我编写了两个程序:将文本文件的行转换为一个序列化对象,该对象包含ArrayList中的所有行;我创建了另一个序列化对象,该对象具有int索引,保存成功插入的最后一行的索引

然后,在程序中,我执行以下操作:

charge in memory the object.lines, from the serialized object.
charge in memory the object.index, from the serialized object.
伪代码:

loop:
index = sum 1 to the object.index
line = object.getLine(index)
insert line
if error continue (or goto loop)
send commit
if error continue (or goto loop)
object.index = index
serialize object
这样,我就有了成功提交到数据库的行的备份,我可以在其他时间继续工作。如果线路中存在连接问题,我可以尝试再次插入线路

如果我有连接问题,我会等1分钟。连接已恢复,但会自动重置,而不是由我重置

例如,在这样一行中:

INSERT INTO my_table1 (id) VALUES (sq_mytable1_id.NEXTVAL);
//success

//connection lost
//connection reset

INSERT INTO my_table2 (id) VALUES (sq_mytable1_id.CURRVAL);
//error, sq_mytable1_id.CURRVAL is not in session.
我得到一个ORA-08002异常,因为连接被重置,我可以从会话中获取sq_mytable1_id.CURRVAL

请告诉我如何编程一个批处理sql插入器来容忍wi-fi连接中断


我想序列化连接,但我不能:oracle.jdbc.driver.T4CConnection不可序列化。

为什么序列化连接会有帮助?问题是有两个相关的插入,看起来它们应该构成原子事务的一部分,被视为两个事务。实际上,您不应该在第二次插入之后才提交,尽管事务可能会更大。如果您的逻辑更简单的话,您可以有一个执行两个插入的过程。您也可以将序列值作为插入的一部分返回,并使用该值而不是
currval
,但这听起来不是最好的解决方案。是否还有其他限制导致您采用此方案?我不知道jdbc在内部是如何工作的,但我的想法是,在连接重置后保持相同的会话标识符。如果您有一个新连接,那么您就有一个新会话,这样您在数据库端就不会有相同的会话ID;虽然不太确定这和你的序列有什么关系。如果需要知道连接重置过程中的序列值,则需要在Java端检索并存储它,并在后续调用中使用它。您不能使
currval
在会话更改期间工作。您似乎也没有作为“批处理”来做任何事情,这些看起来像很多单行插入。你看过吗?