【发布时间】:2018-10-23 07:49:15
【问题描述】:
我尝试通过这种方式使用EntityManager的“createStoredProcedureQuery”调用Oracle存储过程:
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void saveMeterVol(Meter meter, Double vol1, Chng chng, User user, Date dt1, Date dt2) {
StoredProcedureQuery qr = em.createStoredProcedureQuery("mt.P_METER.meter_vol_ins_upd_java");
qr.registerStoredProcedureParameter(1, Integer.class, ParameterMode.OUT);
qr.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN);
qr.registerStoredProcedureParameter(3, Integer.class, ParameterMode.IN);
qr.registerStoredProcedureParameter(4, Double.class, ParameterMode.IN);
qr.registerStoredProcedureParameter(5, Date.class, ParameterMode.IN);
qr.registerStoredProcedureParameter(6, Date.class, ParameterMode.IN);
qr.registerStoredProcedureParameter(7, String.class, ParameterMode.IN);
qr.setParameter(2, meter.getId());
qr.setParameter(3, chng.getId());
qr.setParameter(4, vol1);
qr.setParameter(5, dt1);
qr.setParameter(6, dt2);
qr.setParameter(7, user.getCd());
qr.execute();
}
当我调用此方法超过 300 次时,Oracle 陷入异常: ORA-01000: 超出最大打开游标数
据我了解,Java 在调用我的过程后不会关闭 Oracle 游标,但我不明白为什么?
我试过了
em.close();
但它没有帮助。
我用:
<spring-framework.version>5.0.5.RELEASE</spring-framework.version>
<hibernate.version>5.1.0.Final</hibernate.version>
<java.version>1.8</java.version>
【问题讨论】:
-
尝试在您的数据库中打开更多游标
ALTER SYSTEM SET OPEN_CURSORS=1000 SID='*' SCOPE=BOTH;,也请阅读此内容,也许它可以帮助您stackoverflow.com/questions/12192592/… -
这不是解决方案,根据您的链接:“游标泄漏是错误;增加数据库上的游标数量只会延迟不可避免的故障”如果我想调用我的方法,这只是临时解决方案超过1000次,它会再次陷入异常
标签: java oracle hibernate jpa stored-procedures