Grails应用程序访问数据时遇到了一个奇怪的问题。更深入的我使用PreparedStatement.executeQuery vs Statement.executeQuery将问题分离到一个普通的java8小应用程序。
考虑以下代码片段:
// executes in milliseconds
directSql = "select top(10) * from vdocuments where codcli = 'CCCC' and serial = 'SSSS' ORDER BY otherField DESC;";
stmt = con.createStatement();
rs = stmt.executeQuery(directSql);
// More than 10 minutes
sqlPrepared = "select top(10) * from vdocuments where codCli = ? and serial = ? ORDER BY otherField DESC;";
PreparedStatement pStatement = con.prepareStatement( sqlPrepared );
pStatement.setString(1, "CCCC");
pStatement.setString(2, "SSSS");
rsPrepared = pStatement.executeQuery();
相同的查询。
数据来自一个有超过1500万条记录的SqlServer(2008年,我认为现在无法访问)的视图。所有需要的字段都有索引,并且从控制台运行执行的相同查询(第一个)也非常快。
如果我在没有ORDER子句的情况下执行慢速PreparedStatement查询,它也会快速运行。
我很清楚,对于任何原因,数据库在使用preparedStatement时没有使用索引并进行完整扫描,但也许我错了所以我对任何想法持开放态度。
我想也许驱动程序(sqlserver官方最新和jtds已经过测试)持有数据等待任何类型的EOF连接但我已经检查了tcpdump在我这边没有收到数据。
我无法找到为什么会这样,所以任何想法都会受到欢迎。
先谢谢你了!