Pun*_*cky 13 java oracle stored-procedures jdbc
我有一个oracle stored proc需要从我的Java程序调用.我曾经习惯CallableStatement将参数传递给存储过程.我正在使用oracle瘦驱动程序(在Web逻辑服务器中配置相对于相关的jndi条目).此存储过程没有任何OUT值.此存储过程接受一个数值,并根据收到的值在数据库中执行大量更新.
我得到一个连接对象,然后在循环中调用此存储过程(20次传递20个数字).当我从oracle客户端直接调用此存储过程时,执行将在2-3秒内完成.但是我的java代码无法预测这种行为.有些呼叫甚至需要30-40秒才能完成.
我尝试使用PreparedStatement而不是CallableStatement并且可以看到边际性能改进(尽管行为仍然不一致).
PreparedStatement而不是CallableStatement给出storedproc没有任何OUT参数?PreparedStatement某些性能提升CallableStatement或者我可能观察到的错误?从你的评论中,你已经在你的循环中准备好了.预处理语句(和可调用语句)的一个优点是,您可以准备一次,然后交换参数中传递的值; 每次准备调用时都会有开销,所以如果你可以把它带到循环之外,你可能会发现运行时间减少了.您可能会发现关闭AutoCommit也会有所帮助,因为每次提交都会产生开销.
conn.setAutoCommit(false);
CallableStatement stmt = conn.prepareCall(sql);
while(true) {
stmt.setInt(1, value);
stmt.execute();
}
conn.commit();
conn.setAutoCommit(true);
Run Code Online (Sandbox Code Playgroud)
(conn.setAutoCommit(true)确实提交,但我发现更清楚明确).