java 数据库操作报错

黄开源中国 发布于 2013/05/23 17:04
阅读 405
收藏 0
代码比较多。贴一些关键的出来。
DBcon db = new DBcon();
Connection con=null; 
Statement stmt=null;
PreparedStatement pstmt = null;
ResultSet rs=null;
try {
	con = db.getConnection();
	stmt = con.createStatement();
	
	sql = "select c_id,c_sid,c_jid,c_dtype,c_fee,c_text,c_userid,c_ip,c_appdate,c_retext,c_redate,c_enable,c_adm,c_check from t_dianping where c_appdate>='"
	+stime+"' and c_appdate<='"+etime+" 23:59:00' "+whereSql+" order by c_id desc";
	
	//System.out.println(sql);
	
	DataTurnPage tp = new DataTurnPage();
	//		@return n*m 1 sql语句 2 本页显示条数 3 第几页
	tp.selectTurnPage(sql,shownum,pagenow);
	
	List s = new ArrayList();
	s = tp.getRes();			//获得结果集
	pagenum = tp.getPagenum();	//获得总页数
	count = tp.getCount();		//获得总记录数
	
	//获得结果集字段
	Object[] obj = null;
        for (int i = 0; i < s.size(); i++) {
		obj = (Object[]) s.get(i);
                //...这里省略一部分代码,就是从结果集数据中取数据的代码
                //查
		sql = "select c_sname,c_id from t_shops where c_id="
					+ c_sname + " ";
		rs = stmt.executeQuery(sql);
		if (rs.next()) {
			c_sname = rs.getString(1);
			if (c_sname.length() > 8)
			c_sname = c_sname.substring(0, 8) + ".";
                 }
		rs.close();
                if (Tools.isNumber(c_area) > 0) {
                        //查劵
			sql = "select c_titles from t_juan where  c_id="+ c_area + " ";
			rs = stmt.executeQuery(sql);
			if (rs.next()) {
				c_sname = rs.getString(1);
				if (c_sname.length() > 8)
					c_sname =   c_sname.substring(0, 8) + ".";
}
				rs.close();
			}
           }
        } catch (Exception e) {
		System.out.println("Exception :" + e);
		e.printStackTrace();

	} finally {
		if (stmt != null) {
			stmt.close();
		}
		if (pstmt != null) {
			pstmt.close();
		}
		if (con != null) {
			con.close();
		}
Exception :com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after statement closed.
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after statement closed.

这是报错的代码。。用的数据源是c3p0。使用了红薯发布的DBManager类,进行了一点点修改,配置基本一样。
加载中
0
红薯
红薯

其实这个错误意思还是非常明确的,Statement 对象被关闭后又继续执行 SQL ,所有应该检查程序的流程。

这里有两个不同的SQL,建议封装到不同的方法中独立执行,独立创建 Statement 然后关闭。这样就不会互相影响

0
御风林海
御风林海
在方法体里面写个参数,把SQL当做参数抛进去,在业务层调用两次方法就好。
0
黄开源中国
黄开源中国

引用来自“红薯”的答案

其实这个错误意思还是非常明确的,Statement 对象被关闭后又继续执行 SQL ,所有应该检查程序的流程。

这里有两个不同的SQL,建议封装到不同的方法中独立执行,独立创建 Statement 然后关闭。这样就不会互相影响

大部分的代码就在这里了,其他都是一些字符串的拼凑,

报错的at org.apache.jsp.comp.dp_005fmanage_jsp._jspService(dp_005fmanage_jsp.java:216)这个216指向的其实就是

catch (Exception e){
   System.out.println("Exception :" + e);
   e.printStackTrace();
}

这里面。

项目是很久之前的,做的时候并没有使用到分层的思想,报错的不只是这里,基本上一个方法里面包含两个或以上查询都报错了,如果要改造,基本等于要重做项目了。。我也知道这是由于statement关闭了造调用造成,但是我不明白这个问题是由代码里面的什么东西引起的,从代码上看,我想不到哪里会引起这个问题。当我把

else if("close".equals(method)){
     log.info("[close connection] >>> " );
     return null;}

这段代码加进去DBManager的代理invoke方法,改造了connetion的close方法之后,代码就没报错了。。

0
不是小白
不是小白

 之所以会出现这个异常,是因为Mysql在5以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后,Mysql会自动把这个连接关闭。所以使用连接池的时候虽然连接对象还在但是链接数据库的时候会一直报这个异常。

下面给你个链接,你自己看看:

http://blog.csdn.net/bedweather/article/details/6743951

黄开源中国
黄开源中国
那如果按照这么说的话,我把项目重启下,把TOMCAT那些长时间的链接关闭掉,应该就可以正常访问了对吧?然后又直到超过8小时再报错?~我试试
返回顶部
顶部