公众号

关于Mybatis从几百万条记录返回7万条记录,并在tomcat显示问题

- - 阅 263

1)由于客户字段并不统一,随时有可能变化,是由Excel上传动态解析Excel形成的一个动态表,所以Mybatis返回,resultType并不是一个具体的Bean ,而是一个List<Map>

<select id=”find” resultType=”java.util.HashMap”
parameterType=”java.util.HashMap”>
${sql}
</select>

数据量小的时候,还不明显,数据量一大,数万条记录,就要了 老命了,用List<Map>解决动态字段的问题,在大数据下 是很不实用的,所以我直接用了JDBC的ResultSet,并用流式打开PreparedStatement

SqlSession session = sqlSessionFactory.openSession();
// List ll=session.selectList(“query”,TableObject.class);
JSONArray vos = new JSONArray();
Connection conn = null;
try {
conn = session.getConfiguration().getEnvironment().getDataSource().getConnection();
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

try {
while (rs.next()) {
JSONObject vo = new JSONObject();
for (int i = 1; i <= columnCount; i++) {
String key = rsmd.getColumnName(i);
String value = rs.getString(i);
vo.put(key, value);
}
vos.add(vo);
}
} catch (Exception e) {
e.printStackTrace();
}

rs.close();
stmt.close();
// conn.close();
} catch (Exception e) {
e.printStackTrace();
}

session.close();

时间立即由几十秒 缩短为 几秒或者10几秒

2) 数据量返回太大,tomcat假死

tomcat的server.xml修改为:

<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
compression=”on”
compressionMinSize1=”2048″
noCompressionUserAgents=”gozilla, traviata”
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
redirectPort=”8443″ />

即启用tomcat压缩形式,tomcat响应立即 由一分钟以上 缩短为几秒。

 

 

0

本文转载 " "

原文地址 " "

相关文章!