问题描述
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%@pageimport="java.sql.*"%><%@pageimport="javax.sql.*"%><%@pageimport="javax.naming.*"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%!privateConnectioncon;%><%response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires",0);%><%Stringfunction=request.getParameter("function");Stringdevice_name=request.getParameter("device_name");Stringdevice_type=request.getParameter("device_type");try{//请求传来的函数名function=newString(function.getBytes("ISO-885Array-1"),"utf-8");//请求传来的设备名称device_name=newString(device_name.getBytes("ISO-885Array-1"),"utf-8");//请求传来的设备类型/*device_type=newString(device_type.getBytes("ISO-885Array-1"),"utf-8");*/}catch(Exceptione){e.printStackTrace();}//获取连接ContextinitContext=newInitialContext();ContextenvContext=(Context)initContext.lookup("java:/comp/env");DataSourceds=(DataSource)envContext.lookup("jdbc/orcl");try{con=ds.getConnection();}catch(Exceptione){}//System.out.println(function+device_name+device_type);%><%//根据参数判断调用那个函数if("devprop".equals(function)){Stringresponse_prop=this.devprop(device_name);if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}out.clear();out.print(response_prop);}elseif("devpoints".equals(function)){Stringresponse_prop=this.devpoints(device_name);if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}out.clear();out.print(response_prop);}elseif("subdevice".equals(function)){Stringresponse_prop=this.subdevice(device_name,device_type);if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}out.clear();out.print(response_prop);}elseif("devsearch".equals(function)){Stringresponse_prop=this.devsearch(device_name,device_type);if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}out.clear();out.print(response_prop);}else{out.print("{}");//函数名称不存在}%><%!publicStringdevprop(Stringdevice_name){//设备属性查询Stringstr=null;PreparedStatementps=null;ResultSetrs=null;try{Stringsql="selectid,name,prop_name,did,valuefrom(selecta.id,a.name,a.prop_name,a.did,b.valuefrom(selects.id,s.name,d.prop_name,d.iddidfrom(selectid,name,devtyp_id,parent_idfrom(selectid,substr(sys_connect_by_path(name,'.'),2)name,devtyp_id,parent_idfromdevicestartwithIDin(selectidfromdevicewhereparent_id=0)connectbypriorid=PARENT_ID))s,devtyp_property_defdwheres.devtyp_id=d.devtyp_id)aleftouterjoindevice_property_recbona.id=b.device_idanda.did=b.prop_id)zwherename=?";ps=con.prepareStatement(sql);ps.setString(1,device_name);rs=ps.executeQuery();intdid=0;Stringname=null;Stringvalue=null;//属性名称Stringprop_name=null;intid=0;Stringstr0=null;StringBuffersb=newStringBuffer();if(!rs.next()){Stringsqlnull="selectidfrom(selectid,name,devtyp_id,parent_idfrom(selectid,substr(sys_connect_by_path(name,'.'),2)name,devtyp_id,parent_idfromdevicestartwithIDin(selectidfromdevicewhereparent_id=0)connectbypriorid=PARENT_ID))wherename=?";PreparedStatementpsnull=null;ResultSetrsnull=null;try{psnull=con.prepareStatement(sqlnull);psnull.setString(1,device_name);rsnull=psnull.executeQuery();if(rsnull.next()){id=rsnull.getInt("id");str="{"+""deviceid":"+id+","+""name":"+"""+device_name+"""+","+""prop":["+"]}";}else{str="{}";//并无此设备名称!}}catch(Exceptione){e.printStackTrace();}finally{if(rsnull!=null){try{rsnull.close();}catch(SQLExceptione){e.printStackTrace();}rsnull=null;}if(psnull!=null){try{psnull.close();}catch(SQLExceptione){e.printStackTrace();}psnull=null;}}}else{do{name=rs.getString("name");did=rs.getInt("did");prop_name=rs.getString("prop_name");value=rs.getString("value");id=rs.getInt("id");str0="{"+""id":"+did+","+""name":"+"""+prop_name+"""+","+""value":"+"""+value+"""+"},";sb.append(str0);}while(rs.next());str="{"+""deviceid":"+id+","+""name":"+"""+device_name+"""+","+""prop":["+sb.toString().substring(0,sb.toString().length()-1)+"]}";}}catch(Exceptione){e.printStackTrace();}finally{if(rs!=null){try{rs.close();}catch(SQLExceptione){e.printStackTrace();}rs=null;}if(ps!=null){try{ps.close();}catch(SQLExceptione){e.printStackTrace();}ps=null;}}returnstr;}%>(代码有省略掉两个函数)上述jsp会在很多地方引用到,我现在的问题是项目在使用过程中偶尔会出现一个异常:就像图片上那样,关键地方不小被遮到了。。。这个问题很少出现所以我现在也没法知道上面那个被遮到的到底是什么。。。主要想让大家看看我的代码哪里有问题么(主要就是数据库连接,事务,结果集这三个地方)?请大家帮帮忙,谢谢了!
解决方案
解决方案二:
连接已关闭。就是说,引用到的连接,在你这次用的时候,已被关闭掉了。一般在多线程环境下出这种问题,就是有的线程用完conn之后将其关闭了,其他线程又拿来用。。。
解决方案三:
引用1楼defonds的回复:
连接已关闭。就是说,引用到的连接,在你这次用的时候,已被关闭掉了。一般在多线程环境下出这种问题,就是有的线程用完conn之后将其关闭了,其他线程又拿来用。。。
请问这种情况改怎么解决呢?谢谢你了
解决方案四:
首先,建议你的代码if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}这个放到最后,只放一处,到处放,一不小心,还要用就关掉了
解决方案五:
引用3楼xinggg的回复:
首先,建议你的代码if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}这个放到最后,只放一处,到处放,一不小心,还要用就关掉了
谢谢你我会尝试一下的
解决方案六:
解决方案七:
数据库连接没打开吧。
解决方案八:
解决方案九:
连接池中的连接不能关掉。con.close();错误了。连接池是为了取连接方便,如果取出来了并且用了最后放回去,你关了算怎么回事?等你关完了还不是要重新建立连接,这就浪费时间了就和没有用连接池一样了。
解决方案十:
再说你的连接池是tomcat管理的,这种方式叫做jndi(一j2ee中规范),根本不需要自己关掉。这里有个模拟连接池的http://blog.sina.com.cn/s/blog_6383597b0100fwb8.html连接不用请放回。
解决方案十一:
改用spring