JDBC执行存储过程异常慢

来源:百度知道 编辑:UC知道 时间:2024/05/09 09:10:09
现在我的系统用存储过程进行入库,存储过程的逻辑是先用某个where条件先查库表(tfa_alarm),如果查到数据,则只用更新表的某个字段,如果没有查到数据则插入到库中。
新在的问题是,在用

PreparedStatement.execute()

时,正常情况下的执行时间是100毫秒(ms)左右,但是每执行一段时间,大概存储过程每执行300次,PreparedStatement执行就会特别缓慢,大概是200秒(s)左右。因为我的系统是实时系统,所以在这200s中间就会堆积很多数据。
说明:
1.我是每次PreparedStatement.execute()后都执行clearParameters(),并commit()和Connection.close()。
2.系统已经正常运行了几个月,都没有问题,只是在近两周才出现这种问题,在这两周内没有修改过程序。
3.我的数据库是ORACLE。
现在我是怀疑是因为数据库引起的,只是找不到具体原因,各位有何高见?

1.connection不知道你是采用什么方式获取的,如果不是从连接池里取,你每connection.close()一次,下次get的时候会重新建立实际物理链接,这样会相当耗时。所以你检查一下是在获取connection时耗的时间多,还是在execute的时间多。代码:
long startTime = System.currentTimeMillis();
conn = getConnection(); // execute();
long endTime = System.currentTimeMillis();
System.out.println("获取链接的时间:" + (endTime - startTime));
执行的类似;

2.从你的存储过程的逻辑来说,要条件查询,更新某个字段的值,和入库,这三个步骤应该有输入参数的,那么你的这个参数是怎么传入的?
个人觉得你的这个存储过程可以优化成SQL来执行,效率应该会更好:
首先,你把输入参数放入一个临时表;
比如结构是:
_id _field
查询的条件 更新的字段

// 更新_table中存在的记录的_field字段,并且只更新_table与_tmp键值相等的记录
UPDATE _table t SET _field=(SELECT MAX(_field) FROM _tmp WHERE _id=t._id) WHERE EXISTS (SELECT 'X' FROM _tmp WHERE _id=t._id);

// 选择_table与_tmp键值不相等的记录(即_table中不存在的记录)插入_table
INSERT INTO _table (_id,_field) (SELECT _id,_field FROM _tmp t WHERE NOT EXISTS (SELECT 'X' FROM _table WHERE _id=t._id));

这样的话,每次都是两个批量操作,而且不需要输入参数,直接调用就可