我有一个oracle stored proc
需要从我的Java程序调用。我曾使用CallableStatement
将参数传递给存储过程。我正在使用oracle瘦驱动程序(在web逻辑服务器中针对相关的jndi条目进行配置)。此存储过程没有任何OUT值。这个存储过程接受一个数值,并根据接收到的值在数据库中做很多更新。的PreparedStatement,CallableStatement的和性能考虑
我得到一个连接对象,然后调用这个循环存储过程(20次传递20号)。当我直接从oracle客户端调用这个存储过程时,执行会在2-3秒内完成。但是,这种行为是不可预测的从我的java代码。有些电话甚至需要30-40秒才能完成。
我试图使用PreparedStatement
而不是CallableStatement
,并可以看到边际性能的改善(尽管行为仍然不一致)。
- 是否确定在我的情况下使用
PreparedStatement
,而不是CallableStatement
鉴于storedproc没有任何OUT参数? - 没有任何理由为什么
PreparedStatement
具有一定的性能增益超过CallableStatement
或者是它的东西,我可能会观察是否有误? - 解决这个性能问题有更好的方法吗?
你能后的代码?或者,确认每次迭代都没有建立连接(而不是重复使用一个连接),并确认每次迭代都没有调用'conn.prepareCall()'(而不是只有'.setInt() )'和'.execute()'在循环中)。 – Matt 2012-01-05 18:56:36
您不止一次地调用存储过程,对吗?你有没有尝试过使用批量调用? http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/callablestatement.html请参阅7.1.3 – 2012-01-05 18:57:22
为什么不尝试匿名PL/SQL块(开始...调用过程...调用过程......结束;)调用你的存储过程20次,并使用匿名块对数据库进行一次调用。 – GriffeyDog 2012-01-05 19:05:57