最近在检查一方法时发现程序执行SQL查询时非常慢,但使用PLSQL DEV工具执行查询语句又很快。
看以下代码:
public boolean isExistSonoByStoreCode(String storeCode, String soNo, String billId) { StringBuffer sql = new StringBuffer(); sql.append("select bill_id, so_no from store_in_head where store_code = ? and UPPER(so_no) = UPPER(?) "); DBUtil dbu = null; PreparedStatement preStmt = null; ResultSet rs = null; boolean isExistSono = false; try { dbu = new DBUtil(); preStmt = dbu.getConnection().prepareStatement(sql.toString()); preStmt.setString(1, storeCode); preStmt.setString(2, soNo); rs = preStmt.executeQuery(); while (rs.next()) { String oldBillId = rs.getString("bill_id"); if (!oldBillId.equalsIgnoreCase(billId)) { isExistSono = true; } } } catch (Exception e) { log.error(e.getMessage(),e); } finally { try { rs.close(); } catch (Exception e) { ; } try { preStmt.close(); } catch (Exception e) { ; } closeDButil(dbu); } return isExistSono; }
经DEBUG发现速度慢确实发生在查询时,即执行rs = preStmt.executeQuery();时
一开始怀疑是语句使用UPER函数导致的,但是把语句修改为不使用函数也一样慢。。怀疑是使用了PreparedStatement 参数需要动态绑定问题,于是将PreparedStatement 改为Statement ,执行却很快,修改后的代码如下:
public boolean isExistSonoByStoreCode(String storeCode, String soNo, String billId) { StringBuffer sql = new StringBuffer(); sql.append("select bill_id, so_no from store_in_head where store_code = '" + storeCode + "' and UPPER(so_no) = UPPER('"+ soNo +"') "); DBUtil dbu = null; Statement preStmt = null; ResultSet rs = null; boolean isExistSono = false; try { dbu = new DBUtil(); preStmt = dbu.getConnection().createStatement(); rs = preStmt.executeQuery(sql.toString()); // preStmt.setString(1, storeCode); // preStmt.setString(2, soNo); // rs = preStmt.executeQuery(); while (rs.next()) { String oldBillId = rs.getString("bill_id"); if (!oldBillId.equalsIgnoreCase(billId)) { isExistSono = true; } } } catch (Exception e) { log.error(e.getMessage(),e); } finally { try { rs.close(); } catch (Exception e) { ; } try { preStmt.close(); } catch (Exception e) { ; } closeDButil(dbu); } return isExistSono; }
字段类型:STORE_CODE CHAR(3),SO_NO VARCHAR2(100)
类似问题:http://bbs.csdn.net/topics/320181076
相关推荐
当你的代码运行很慢的时候JDBC 驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善 JDBC 应用程序的性能介绍一些基本的指导原则,这其中 的原则已经被许多现有的 JDBC应用程序编译运行并验证过。 这些...
PLSQL隔断时间再执行sql的时候卡死未响应(要等很久才有结果)解决办法
Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在不同的条件下,一个SQL可能存在多条执行计划,但是在某个特定的时间点,特定的环境下...
当你在文件夹里有很多很多很多的SQL文件需要执行时候,一个一个复制路径文件名出来执行肯定很慢很烦。 而且你不关心他们的执行顺序的时候,这时我们可以简单的利用Dos把文件夹里所有SQL文件的路径与文件名统一导成一...
plsql创建存储过程并创建job定时任务执行-详细笔记文档总结
PLSQL中文乱码问题解决方案,让你快速解决乱码问题
PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。... 该安装包包含了解决PLSQL过期的文件,将PLSQL安装后将解决过期的文件放到安装包中,即可解决PLSQL过期的问题。即可永久使用。
开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果。但是奇怪的是执行其他的select语句却是可以执行的。 原因和解决方法 这种...
PLSQL jdbc调用存储过程(入门)
PLSQL显示乱码、导出问题的解决方法
用PLSQL连接数据库操作时经常自动断开,解决方法如下
PLSQL连接远程数据库问题 无法连接报错
用PLSQL Developer时,表提示不能执行,应该是几个表的权限不够,通过执行以下代码,应该就可以运行啦
plsql如何执行.sql文件的文档,PL/SQL登录到数据库,使用tools工具进行导入,使用plsql登录到需要导入数据的数据库,点击工具栏上【tools】--【Import tables】
plsql developer 中文乱码 问号的解决办法,中文乱码 中文乱码 中文乱码
plsql连接64位oracle问题
解决plsql远程连接oracle数据库的问题,这是本人在网上找到的,跟人感觉很赞,跟大家分享一下
因为数据库字符集导致的PLSQL乱码解决办法
解决 PLSQL 12 汉化不完全 汉化不完整 汉化后还显示英文 问题