开发者社区 问答 正文

java 数据库操作报错?报错

代码比较多。贴一些关键的出来。

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类,进行了一点点修改,配置基本一样。

展开
收起
爱吃鱼的程序员 2020-06-22 19:16:29 551 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

    在方法体里面写个参数,把SQL当做参数抛进去,在业务层调用两次方法就好。

    引用来自“红薯”的答案

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

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

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

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

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

    那如果按照这么说的话,我把项目重启下,把TOMCAT那些长时间的链接关闭掉,应该就可以正常访问了对吧?然后又直到超过8小时再报错?~我试试
    2020-06-22 19:16:48
    赞同 展开评论