2

I use an Oracle Database with JDBC and execute INSERTs on a connection. For each insert I create a new Statement.

After much inserts (>1000), the error ORA-01000 occurs, meaning that Oracle has open cursors for the inserts. I know, I have not close the statements. If I close them, everything goes well.

The question is, why does Oracle create cursors for insert actions?

When I execute a SELECT, Oracle give a ResultSet back. I've tried to close the result sets but not the underlying statements. In this case (without inserts), the problem never occurs.

4

2 回答 2

1

Oracle 中的每条语句都是一个游标。Oracle 中的游标旨在供客户端重用。如果客户端不再使用游标,则客户端负责关闭游标。

在 java 中你应该几乎总是使用PreparedStatement. 忘记常规Statement,几乎没有理由使用它们。

PreparedStatement解析一次并根据需要执行多次:

  1. 准备声明
  2. 绑定尽可能多的变量
  3. 执行
  4. 重复2-3直到完成,然后关闭。

或者,如果您想限制数据库往返,您可以:

  1. 准备声明
  2. 绑定尽可能多的变量
  3. 添加批处理
  4. 重复 2-3 直到完成,然后执行批处理
  5. 关闭光标
于 2013-05-30T13:55:13.467 回答
0

您应该始终关闭不再使用的数据库资源,并在它们打开时重用它们。
其他任何事情最终都会导致数据库资源耗尽,从而导致严重的崩溃。

于 2013-05-30T12:38:19.050 回答