SSH2 问题,求SSH2高手帮解决

荷梅月剑 2014-11-13 03:21:29
struts2
springframework 3.1.0
hibernate3

在Dao里,调用
this.getSession().createSQLQuery(sqlString);
连接池不自动关闭,时间长了连接池就会满。
而调用
this.getSession().createQuery(sqlString);
就不会出错,但是项目需要,有LEFT JOIN之类的SQL,不调用createSQLQuery不行。

我尝试了在调用完后执行了
this.getSession().close();
this.getSession().clear();
没有效果

现在只能是靠设置Tomcat的连接池中的removeAbandonedTimeout=10来临时解决问题。
但是只是治标不治本,当并发大的时候,还是会出错。
求一完美解决方案。
跪谢。
...全文
277 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿人林克 2014-11-14
  • 打赏
  • 举报
回复
首先,我认为createSQLQuery和createQuery的区别在于功能,和连接没有关系。前面可以跑sql,返回一个list,后者只能hql,返回对象list。 其次,session是肯定可以释放的,一般大型项目都是通过配置最大最小连接和空闲连接时间来达到性能和连接数的平衡。
  • 打赏
  • 举报
回复
其实这种情况一般都用Profile工具跟踪一下就知道了;如果真的是连接未释放的问题,跟踪跟踪源代码就清楚了。
一旦 2014-11-13
  • 打赏
  • 举报
回复
HQL好像也可以连接查询啊
xingbear 2014-11-13
  • 打赏
  • 举报
回复
引用 4 楼 Drunkard_Faron 的回复:
行了,自己解决了
怎么解决的
荷梅月剑 2014-11-13
  • 打赏
  • 举报
回复
行了,自己解决了
荷梅月剑 2014-11-13
  • 打赏
  • 举报
回复
回复2楼,那个都配置了,跟Tomcat无关,是session没有关闭连接池。
meng020712 2014-11-13
  • 打赏
  • 举报
回复
你是用Hibernate中用连接池的方式是吧、 要是这样的、就应该在Tomcat中配置web.xml和context.xml\ 连接池的、 这个你配置好了吗?
荷梅月剑 2014-11-13
  • 打赏
  • 举报
回复
代码如下 连接池会超时的代码:
@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;
	}

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧