关于润乾报表里SQL执行速度的问题处理方式

1. 问题概述 
A.很多时候,客户在用我们报表工具或集成时,导致一些别的问题出现,其实这些问题可能和咱们没有关系,他会认为是用了你润乾报表才导致这些的问题,或者有一种依赖心理,掏的是买轿车的钱却想着赠送修飞机的服务.
B.之前有个客户反应报表计算慢,通过看后台日志,发现时间都是花在了执行sql上面,但同时客户会说,这个sql拿到数据库端去执行,速度很快,对于含参数的sql,执行时间的差异会显得尤为明显.但是,客户将sql拿到数据库端去执行,往往是模拟不了传参的过程,检索条件都是在sql里写死的.
2. 解决办法 
为了证明这个sql执行速度慢,不是润乾的关系,可以建议客户写一段java代码,不调用润乾的任何接口,采用PreparedStatement执行这个sql,这样客户会发现,即使不用润乾,执行一个带参数的sql所花的时间与报表里所花时间是差不多的.
同一张表,同样的条件,详见代码里query1,query2方法
A: 条件直接写在SQL语句上,执行结果 

B: 条件传递在SQL语句上,执行结果 

3. 程序代码 

package api;

import java.sql.*;

public class TestSQL {

public TestSQL() {

}

public static void main(String[] args){

query1();

query2();

}

public static void query1(){

Connection conn = null;

PreparedStatement stat = null;

ResultSet rs = null;

try {

Class.forName("com.newatlanta.jturbo.driver.Driver");//数据库驱动

conn = DriverManager.getConnection(

"jdbc:JTurbo://127.0.0.1/DBA/charset=GBK", "sa ", "sa");

String sql_noParam = "SELECT *  FROM 订单明细 where 单价 > 10";

//直接写定参数的SQL语句

stat = conn.prepareStatement(sql_noParam);

long startTime = System.currentTimeMillis();

System.out.println("query1   begin   time: " + startTime);

rs = stat.executeQuery();

while (rs.next()) {

//遍历一遍结果集,这个循环可以去掉

}

long costTime = System.currentTimeMillis() - startTime;

System.out.println("Query1 cost time: " + (costTime/1000) + "s" + (costTime%1000) + "ms");

}

catch (Exception e) {

e.printStackTrace();

}

finally {

//任务结束,关闭连接、结果集等项

try {

if ( rs != null ) rs.close();

if ( stat != null ) stat.close();

if (conn != null ) conn.close();

}

catch (SQLException e) {

e.printStackTrace();

}

}

}

 

public static void query2(){

Connection conn = null;

PreparedStatement stat = null;

ResultSet rs = null;

try {

Class.forName("com.newatlanta.jturbo.driver.Driver");

conn = DriverManager.getConnection(

"jdbc:JTurbo://127.0.0.1/DBA/charset=GBK", "sa ", "sa");

String sql_withParam = "SELECT *  FROM 订单明细 where 单价 > ?";

//带参数sql

stat = conn.prepareStatement(sql_withParam);

stat.setInt(1, 10);//设定第一个参数为Int,值为10,其它类型用stat.setString,stat.setTimestamp等等

long startTime = System.currentTimeMillis();

System.out.println("query2   begin   time: " + startTime);

rs = stat.executeQuery();

 

while (rs.next()) {

//遍历一遍结果集,这个循环可以去掉

}

long costTime = System.currentTimeMillis() - startTime;

System.out.println("Query2 cost time: " + (costTime/1000) + "s" + (costTime%1000) + "ms");

}

catch (Exception e) {

e.printStackTrace();

}

finally {

try {

if ( rs != null ) rs.close();

if ( stat != null ) stat.close();

if (conn != null ) conn.close();

}

catch (SQLException e) {

e.printStackTrace();

}

}

}

}


你可能感兴趣的:(报表应用)