我做了这个不关闭连接的查询,我无法弄清楚原因。 这是显示连接数的屏幕截图(这就是我知道连接未关闭的原因)
请帮我解决问题。
这是代码:
@Override
public Map<MenuItem, Long> getGtinFromIngredientByLinkedProduct(Map<Long, MenuItem> ingredientIdProductMap) {
Map<MenuItem, Long> result = new HashMap<MenuItem, Long>();
String sql = "SELECT INGREDIENTS_GLOBAL_TRACK_IDF, INGREDIENT_ID FROM [PWRNXGDTA].INGREDIENTS WHERE INGREDIENT_ID in (";
StringBuilder ingredientsIDs = new StringBuilder();
boolean first = true;
Set<Long> ingredients = ingredientIdProductMap.keySet();
System.out.println("Ingredient id's SIZE: " + ingredients.size());
for(Long ingredientId : ingredients) {
if(!first){
ingredientsIDs.append(",");
} else {
first = false;
}
ingredientsIDs.append(ingredientId);
}
sql+= ingredientsIDs+")";
Connection con = null;
PreparedStatement ps = null;
QueryRunner q = null;
ResultSet rs = null;
try {
q = super.getQueryRunner();
con = q.getDataSource().getConnection();
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
result.put(ingredientIdProductMap.get(rs.getLong("INGREDIENT_ID")),
rs.getLong("INGREDIENTS_GLOBAL_TRACK_IDF"));
}
} catch (DAOException | SQLException e) {
logger.info(e.getMessage());
}
finally {
try {
if(ps != null){
ps.close();
}
if(con != null) {
con.close();
}
if(q != null) {
q.getDataSource().getConnection().close();
}
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
有什么想法吗?
由于
答案 0 :(得分:1)
在你的finally块中,你没有创建新连接吗?
if(q != null) {
q.getDataSource().getConnection().close();
}
QueryRunner
有prepareConnection
的一些方法,可以使用不同的close
来简化处理。