查询结束后,不会关闭与db的连接

时间:2017-03-02 09:53:16

标签: java sql sql-server database prepared-statement

我做了这个不关闭连接的查询,我无法弄清楚原因。 这是显示连接数的屏幕截图(这就是我知道连接未关闭的原因) enter image description here

请帮我解决问题。

这是代码:

@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;
    }

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

在你的finally块中,你没有创建新连接吗?

if(q != null) {
    q.getDataSource().getConnection().close();
} 

QueryRunnerprepareConnection的一些方法,可以使用不同的close来简化处理。