本帖最后由 Drunkard_Faron 于 2014-11-13 15:23:18 编辑

解决方案 »

  1.   

    代码如下
    连接池会超时的代码:
    @SuppressWarnings("unchecked")
    @Override
    public List<Object[]> getObjectList() throws Exception {
    String sqlString = "";
    List<Object[]> list = null;
    try {
    sqlString += " SELECT a.id," + "a.name," + "a.card_type," + "a.card_num," + "a.sex," + "a.birthday," + "a.nation," + "a.political," + "a.center_id," + "a.gradation_id," + "a.specialty_id," + "a.school_name," + "a.phone," + "a.qq," + "a.province_id," + "a.city_id," + "a.district_id," + "a.address," + "a.update_datetime," + "a.apply_user_id," + "p1.name card_type_name," + "p2.name sex_name," + "p3.name nation_name," + "p4.name political_name," + "c.name center_name," + "g.name gradation_name," + "s.name specialty_name," + "pr.ProvinceName," + "ci.CityName," + "di.DistrictName";
    sqlString += " FROM apply a";
    sqlString += " LEFT JOIN parameter p1 ON p1.id = a.card_type";
    sqlString += " LEFT JOIN parameter p2 ON p2.id = a.sex";
    sqlString += " LEFT JOIN parameter p3 ON p3.id = a.nation";
    sqlString += " LEFT JOIN parameter p4 ON p4.id = a.political";
    sqlString += " LEFT JOIN center c ON c.id = a.center_id";
    sqlString += " LEFT JOIN gradation g ON g.id = a.gradation_id";
    sqlString += " LEFT JOIN specialty s ON s.id = a.specialty_id";
    sqlString += " LEFT JOIN province pr ON pr.ProvinceID = a.province_id";
    sqlString += " LEFT JOIN city ci ON ci.CityID = a.city_id";
    sqlString += " LEFT JOIN district di ON di.DistrictID = a.district_id";
    sqlString += " INNER JOIN (" + "SELECT MAX(update_datetime) max_update_datetime,apply_user_id " + "FROM apply GROUP BY apply_user_id" + ") l_a";
    sqlString += " ON l_a.apply_user_id = a.apply_user_id AND l_a.max_update_datetime = a.update_datetime";
    sqlString += " ORDER BY a.apply_user_id DESC,a.update_datetime DESC";
    list = this.getSession().createSQLQuery(sqlString).list();
    } catch (Exception e) {
    log.error(e);
    throw e;
    }
    return list;
    }
    连接池不会超时的代码:
    @SuppressWarnings("unchecked")
    @Override
    public List<Apply> getApplyListByApplyUserId(String applyUserId) throws Exception {
    String sqlString = "FROM Apply m WHERE m.applyUserId=? ORDER BY m.updateDatetime DESC";
    List<Apply> list = new ArrayList<Apply>();
    try {
    Query query = this.getSession().createQuery(sqlString);
    query.setString(0, applyUserId);
    list = query.list();
    } catch (Exception e) {
    log.error(e);
    throw e;
    }
    return list;
    }
      

  2.   

    你是用Hibernate中用连接池的方式是吧、要是这样的、就应该在Tomcat中配置web.xml和context.xml\连接池的、 这个你配置好了吗?
      

  3.   

    回复2楼,那个都配置了,跟Tomcat无关,是session没有关闭连接池。
      

  4.   

    其实这种情况一般都用Profile工具跟踪一下就知道了;如果真的是连接未释放的问题,跟踪跟踪源代码就清楚了。
      

  5.   

    首先,我认为createSQLQuery和createQuery的区别在于功能,和连接没有关系。前面可以跑sql,返回一个list,后者只能hql,返回对象list。
    其次,session是肯定可以释放的,一般大型项目都是通过配置最大最小连接和空闲连接时间来达到性能和连接数的平衡。