【发布时间】:2013-12-24 09:34:51
【问题描述】:
我在 Oracle 11g 中有一个存储过程,我使用 Oracle 瘦数据库驱动程序和 CallableStatement 从 Java 程序调用它。这个存储过程在同一个连接的循环中被调用了数千次。
对于前 10 到 20 次调用,callableStatement.execute() 调用在 callableStatement.execute() 现在需要 600 毫秒,并且会继续降级。
如果我定期关闭连接,执行时间会恢复到正常的
在 C 程序中使用 Oracle OCI 驱动程序运行相同的存储过程没有显示性能下降,并且在
有没有人注意到这种行为或对 Java 的解决方法有任何想法?
编辑:这是运行多次的代码部分;连接是共享的,每个循环都会创建 CallableStatement。如果 CallableStatement 被缓存,则没有任何改进。
oracle_conn_time = System.currentTimeMillis();
OracleConnection oracle_conn = (OracleConnection) conn.getMetaData().getConnection();
oracle_conn.setStatementCacheSize(1);
oracle_conn_time = System.currentTimeMillis() - oracle_conn_time;
list_time = System.currentTimeMillis();
var_args= oracle_conn.createARRAY("ARG_LIST", args.toArray());
list_time = System.currentTimeMillis() - list_time;
sql = "{? = call perform_work(?,?,?,?)}";
prepare_time = System.currentTimeMillis();
ocs = (OracleCallableStatement) oracle_conn.prepareCall(sql);
prepare_time = System.currentTimeMillis() - prepare_time;
bind_time = System.currentTimeMillis();
ocs.registerOutParameter(1, OracleTypes.ARRAY, "RESPONSEOBJ");
ocs.setInt( 2, 77);
ocs.setInt( 3, 123456);
ocs.setArray(4, var_args);
ocs.setInt( 5, 123456789);
bind_time = System.currentTimeMillis() - bind_time;
//execute_time is the only timer that shows degradation
execute_time = System.currentTimeMillis();
ocs.execute();
execute_time = System.currentTimeMillis() - execute_time;
results_time = System.currentTimeMillis();
Array return_objs = ocs.getArray(1);
results_time = System.currentTimeMillis() - results_time;
oracle_time = System.currentTimeMillis() - oracle_time;
parse_time = System.currentTimeMillis();
Clob[] clobs = (Clob[]) return_objs.getArray();
return_objs.free();
//Removed clob management code
parse_time = System.currentTimeMillis() - parse_time;
【问题讨论】:
-
你能发布你的代码吗?验证以下链接,在我看来类似的问题stackoverflow.com/questions/8747937/…
-
如果每 10 次调用提交一次会发生什么?
-
@MarkRotteveel 添加提交没有帮助。在上面添加代码
标签: java oracle stored-procedures jdbc callable-statement