由于写到一个查询中,SQL语句写起来有点困难,所以分开来写了,通过父查询方法获取到TML_ID,通过TML_ID作为参数传递给子查询方法,
单独测试的时候没有问题,但是数据量很大的时候,就会出现关闭连接的问题,想请教一下如何处理这些问题?
父查询方法:public List<Terminal> clearFaultByArea(Terminal tml) {
List<Terminal> list = new ArrayList<Terminal>();
log.debug("clearFaultByArea() is running...");
if(tml == null){
log.debug("clearFaultByArea() tml is NULL");
return list;
}
DBConnDTO connDTO = DBConnPool.getInstance().getConnDTO();
if(connDTO == null){
log.warn("clearFaultByArea() : connDTO is NULL");
return list;
}
Connection conn = connDTO.getConn();
if(conn == null){
log.warn("clearFaultByArea() : conn is NULL");
return list;
}
StringBuilder sb = new StringBuilder();
sb.append("SELECT MAN.FULLNAME MAN_NAME,TML.TML_ID,TML.DECARDNUMBER,TML.ONLINETIME,CGC.FULLNAME CINEMA_NAME,CGG.FULLNAME GROUP_NAME " +
"FROM IXTERMINAL TML,CINEMA_GROUP_AREA CGA,CINEMA_GROUP CGC,CINEMA_GROUP CGG,MANUFACTURER MAN " +
                "WHERE TML.GROUP_ID = CGA.CINEMA_GROUP_ID AND CGG.PARENT_ID = CGC.ID AND CGG.ID = CGA.CINEMA_GROUP_ID AND MAN.MANUFACTURER_ID = TML.MANUFACTUREID"
              );
if(tml.getAreaProvince() != null && tml.getAreaProvince().trim().length() != 0){
sb.append(" AND CGA.AREA_PROVINCE LIKE '%"+tml.getAreaProvince()+"%'");
}
if(tml.getAreaCity() != null && tml.getAreaCity().trim().length() != 0){
sb.append(" AND CGA.AREA_CITY LIKE '%"+tml.getAreaCity()+"%'");
}
if(tml.getAreaCounty() != null && tml.getAreaCounty().trim().length() != 0){
sb.append(" AND CGA.AREA_COUNTY = '"+tml.getAreaCounty()+"'");
}
//设备信息
if(tml.getTmlInfoFlag() != null && !tml.getTmlInfoFlag().trim().equals("NOT_SELECTED")){

//设备序列号
if(tml.getTmlInfoFlag().trim().equals("TML_ID")){
if(!tml.getTmlInfoKey().trim().equals("")){
sb.append(" AND TML.TML_ID LIKE '%"+tml.getTmlInfoKey()+"%'");
}
}
//解码卡号
if(tml.getTmlInfoFlag().trim().equals("DECARDNUMBER")){
if(!tml.getTmlInfoKey().trim().equals("")){
sb.append(" AND TML.DECARDNUMBER LIKE '%"+tml.getTmlInfoKey()+"%'");
}
}
//设备通讯号
if(tml.getTmlInfoFlag().trim().equals("PHONENUMBER")){
if(!tml.getTmlInfoKey().trim().equals("")){
sb.append(" AND TML.PHONENUMBER LIKE '%"+tml.getTmlInfoKey()+"%'");
}
}

}
log.debug("clearFaultByArea() sql : "+sb);
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sb.toString());
rs = ps.executeQuery();
while(rs.next()) {
Terminal t = new Terminal();
t.setTmlId(rs.getString("TML_ID"));
if(rs.getString("DECARDNUMBER") != null && rs.getString("DECARDNUMBER").trim().length() > 5){
t.setDeCardNumber(rs.getString("DECARDNUMBER").trim().substring(5));
}else{
t.setDeCardNumber(rs.getString("DECARDNUMBER"));
}
t.setManName(rs.getString("MAN_NAME"));
t.setOnlineTime(rs.getString("ONLINETIME"));
t.setCinemaName(rs.getString("CINEMA_NAME"));
t.setGroupName(rs.getString("GROUP_NAME"));
t.setStartTime(getLastTimeStartTime(rs.getString("TML_ID")));
t.setWaterMark(getLastTimeWaterMark(rs.getString("TML_ID")));
t.setLastStartTime(getLastStartTime(rs.getString("TML_ID")));
list.add(t);
}
} catch (SQLException e) {
log.error("clearFaultByArea()" + e.getMessage(), e);
} finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
log.error("clearFaultByArea()" + e.getMessage(), e);
}
rs = null;
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
log.error("clearFaultByArea()" + e.getMessage(), e);
}
ps = null;
}
DBConnPool.getInstance().giveBackConn(connDTO);
}
return list;
}
子查询方法:public String getLastTimeStartTime(String tmlId) {
String str = new String();
log.debug("getLastTimeStartTime() is running...");
log.debug("tmlId = " +tmlId);
if(tmlId  == null || tmlId.trim().trim().length() == 0){
log.debug("tmlId is NULL");
return str;
}
DBConnDTO connDTO = DBConnPool.getInstance().getConnDTO();
if(connDTO == null){
log.warn("getLastTimeStartTime() : connDTO is NULL");
return str;
}
Connection conn = connDTO.getConn();
if(conn == null){
log.warn("getLastTimeStartTime() : conn is NULL");
return str;
}
StringBuilder sb = new StringBuilder();
sb.append("SELECT START_TIME FROM (SELECT START_TIME FROM MOVIE_PLAYHIS_INFO WHERE TML_ID = '"+tmlId+"' AND DISTRICT != '没有gps信号' AND DISTRICT != '经纬度信息超出地图边界' ORDER BY START_TIME DESC) WHERE ROWNUM = 1");
log.info("getLastTimeStartTime() sql:"+sb.toString());
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sb.toString());
rs = ps.executeQuery();
if(rs.next()) {
str = rs.getString("START_TIME");

}
} catch (SQLException e) {
log.error("getLastTimeStartTime()" + e.getMessage(), e);
} finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
log.error("getLastTimeStartTime()" + e.getMessage(), e);
}
rs = null;
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
log.error("getLastTimeStartTime()" + e.getMessage(), e);
}
ps = null;
}
DBConnPool.getInstance().giveBackConn(connDTO);
}

return str;
}