在某业务场景中,应用程序连接数据库执行查询语句,查询语句的结果集有22万数据,22万的数据通过网络传输到应用端,应用端再处理;
EsgynDB默认情况下是单次返回查询结果集的200,22万数据需要传输22万/200=1100次,多次传输会导致性能的下降;
多次传输导致的性能下降,减少传输次数
1. 应用URL修改
String url = "jdbc:t4jdbc://localhost:23400/:fetchBufferSize=30000";
2. prepareStatement之后,需要st.setFetchSize
preparedStatement.setFetchSize(120000);
3. 添加CQD
cqds.add("cqd HBASE_NUM_CACHE_ROWS_MAX '110000'"); ## 设置一次从hbase中取多少行出来
cqds.add("cqd HBASE_NUM_CACHE_ROWS_MIN '110000'"); ## 设置一次从hbase中取多少行出来
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @ClassName: EsgynJdbcSimple
* @Description: TODO
* @author: xl
* @date: Nov 26, 2020 2:09:26 PM
*/
public class TryFor614plpm {
private static final Logger LOG = LoggerFactory.getLogger(TryFor614plpm.class);
/**
* @Title: main
* @Description: TODO
* @param args
*/
public static void main(String[] args) {
String sql2 = "select * from t614.jtk_xx where eid='19011100001' and workdate='2020-06-22' and channel='B'";
try {
Class.forName("org.trafodion.jdbc.t4.T4Driver");
Connection conn = DriverManager.getConnection("jdbc:t4jdbc://10.12.40.12:23400/:fetchBufferSize=30000"
, "db__root", "trafodion");
List<String> cqds=new ArrayList<>();
// cqds.add("set schema t614");
// cqds.add("cqd DETAILED_STATISTICS 'off';");
// cqds.add("cqd EXPLAIN_IN_RMS 'off';");
// cqds.add("cqd GENERATE_EXPLAIN 'off';");
// cqds.add("cqd HBASE_CACHE_BLOCKS 'off';");
// cqds.add("cqd upd_ordered 'off';");
// cqds.add("cqd QUERY_CACHE_MAX_EXPRS '1800';");
cqds.add("cqd HBASE_NUM_CACHE_ROWS_MAX '120000'");
cqds.add("cqd HBASE_NUM_CACHE_ROWS_MIN '120000'");
cqds.add("cqd ATTEMPT_ESP_PARALLELISM 'off'");
for(String cqd :cqds){
conn.createStatement().execute(cqd);
}
PreparedStatement preparedStatement = conn.prepareStatement(sql2);
preparedStatement.setFetchSize(120000);
long starttime = System.currentTimeMillis();
ResultSet rs=preparedStatement.executeQuery();
long endtime = System.currentTimeMillis();
int count_wb = 0;
while(rs.next()) {
count_wb = rs.getRow();
}
System.out.println("result set size:"+count_wb+"\tcost time: "+(endtime-starttime)+ " ms");
preparedStatement.close();
conn.close();
//
} catch (Exception e) {
e.printStackTrace();
}
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69985104/viewspace-2745016/ ,如需转载,请注明出处,否则将追究法律责任。