PreparedStatement,CallableStatement和性能注意事项

我有一个需要从我的Java程序调用的oracle stored proc 。 我曾使用CallableStatement将参数传递给存储过程。 我正在使用oracle瘦驱动程序(在Web逻辑服务器中配置相对于相关的jndi条目)。此存储过程没有任何OUT值。 此存储过程接受一个数值,并根据收到的值在数据库中执行大量更新。

我得到一个连接对象,然后在循环中调用此存储过程(20次传递20个数字)。 当我从oracle客户端直接调用此存储过程时,执行将在2-3秒内完成。 但是我的java代码无法预测这种行为。 有些呼叫甚至需要30-40秒才能完成。

我尝试使用PreparedStatement而不是CallableStatement并且可以看到边际性能改进(尽管行为仍然不一致)。

  1. 在我的情况下是否可以使用PreparedStatement而不是CallableStatement ,因为storedproc没有任何OUT参数?
  2. 是否有任何理由为什么PreparedStatementCallableStatement有一些性能提升或者我可能观察到的错误?
  3. 有没有更好的方法来解决这个性能问题?

从你的评论中,你在循环中有prepareCall。 预处理语句(和可调用语句)的一个优点是,您可以准备一次,然后交换参数中传递的值; 每次准备调用时都会有开销,所以如果你可以把它带到循环之外,你可能会发现运行时间减少了。 您可能会发现关闭AutoCommit也会有所帮助,因为每次提交都会产生开销。

 conn.setAutoCommit(false); CallableStatement stmt = conn.prepareCall(sql); while(true) { stmt.setInt(1, value); stmt.execute(); } conn.commit(); conn.setAutoCommit(true); 

conn.setAutoCommit(true)确实提交,但我发现它更明确)。

你不应该考虑使用批次吗?

 conn.setAutoCommit(false); CallableStatement stmt = conn.prepareCall(sql); while(true) { stmt.setInt(1, value); stmt.addBatch(); } stmt.executeBatch() conn.commit();