我必须改进一些法典,其中要求从 Java方案获得甲骨质存储程序。 目前,这部法典确实很缓慢:在我的开发机器上多达8秒。 在同一台机器上,如果我直接打电话,回答同样的处理,并填写同样的数据,则用100米以下。
该守则建立了可控声明,将产出参数之一登记为甲骨质 cur,然后利用声明的“目标”方法检索治疗器,并将其归为ResultSet:
cstmt = conn.prepareCall("{ call PKG_ESPECEW.P_ListEspece( ?, ?, ?, ?, ?, ? ) }");
cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
[...]
cstmt.executeQuery();
rs = (ResultSet)cstmt.getObject(4);
rs.setFetchSize(1000); //supposed to help ?
options = new HashMap<String, String>(1000);
rs.next() //added that to measure exactly the length of the first call
while(rs.next()) {
[...]
}
我在守则中设置了一些时间段,以了解其中哪一部分是这么长时间的。 其结果:第1次电话rs.next(<>>/code>正在处理各种秒。 成果集为平均数,从10到几千分。 正如我以前说过的那样,处理来自定期编写的声明的类似结果集,视规模而定,需要10-100个。
法典中是否有任何错误? 我如何改进? 如果我提出任何其他解决办法,那么我确实把卡勒克作为批评点,但我更喜欢一种解决办法,使我不能重新制定所有程序!
这里是储存程序的定义:
PROCEDURE P_ListEspece(P_CLT_ID IN ESPECE.ESP_CLT_ID%TYPE, -- Langue de l utilisateur
P_ESP_GROUP_CODE IN ESPECE.ESP_CODE%TYPE,-- Code du groupe ou NULL
P_Filter IN VARCHAR2, -- Filtre de la requête
P_Cursor OUT L_CURSOR_TYPE, -- Curseur
P_RecordCount OUT NUMBER, -- Nombre d enregistrement retourne
P_ReturnStatus OUT NUMBER); -- Code d erreur