jsp 数据库连接池 tomcat 连接出现异常

问题描述

<%@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

时间: 2024-10-23 20:28:44

jsp 数据库连接池 tomcat 连接出现异常的相关文章

JSP数据库连接池的必要性

js|数据|数据库|数据库连接    最近我作了数据库JSP的频繁连接,在此给出数据库连接池的必要性,对于JSP来说一个很好的J2EE服务器是很必要的,JBOOS,WebLogic都是很好的解决方案. 一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤: 1. 在主程序(如Servlet.Beans)中建立数据库连接. 2. 进行SQL操作,取出数据. 3. 断开数据库连接. 使用这种模式开发,存在很多问题.首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一

论JSP数据库连接池的必要性

js|数据|数据库|数据库连接 一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤: 1. 在主程序(如Servlet.Beans)中建立数据库连接. 2. 进行SQL操作,取出数据. 3. 断开数据库连接. 使用这种模式开发,存在很多问题.首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世

数据库连接池-连接的关闭内幕

们经常会遇到这样那样的连接未关闭的问题,连接没有及时关闭导致的直接后果就是内存泄漏直至down机.我们也都知道解决的方式,但是在解决了问题之后经常会思考为什么会这样呢?连接close()掉,然后在创建不是很浪费cpu等系统资源嘛?有没有更好的方法解决呢?大家也经常听到连接池.线程池之类的线程.池的概念,那么究竟这些概念与我们的连接有什么关系呢?        下面我就想就上面的问题谈谈我的一点浅见,请大家批评指正.        大家都知道java语言是一种语言级的多线程机制的面向对象语言.比如

数据库连接池-c3p0连接池 无需关注statement是否关闭吗

问题描述 c3p0连接池 无需关注statement是否关闭吗 c3p0连接池 ,当connection.close()的时候,把数据连接还回连接池中,那么connection所产生的statement,resultset等对象是怎么关闭的? 解决方案 使用 c3p0 的话,也是 java.sql.Connection,只要是 JDBC 都是这个接口的对象! 使用完后必须 con.close() 掉,使用连接池的话,执行 con.close 并不会关闭与数据库的 TCP 连接,而是将连接还回到池

请教hibernate在BAE中的数据库连接池长连接问题

问题描述 因为BAE不支持长连接,所以默认的设置虽然在本机上跑的好好的,可是一上传跑了没多久就会出现下面这个错误Causedby:org.hibernate.exception.JDBCConnectionException:couldnotexecutequeryatorg.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)atorg.hibernate.exception.JDBCException

Java数据库连接池的几种配置方法(以MySQL数据库为例)_java

一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1.方法一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,如下: <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/chaoshi" auth="

asp.net 数据库连接池浅析_实用技巧

1,对于ASP.NET数据库连接池可以使用一组名称-值对以链接字符串的形式配置链接池.例如,可以配置池是否有效(默认是有效的),池的最大.最小容量,用于打开链接的排队请求被阻断的时间.下面的示例字符串配置了池的最大和最小容量. "Server=(local); Integrated Security=SSPI; Database=Northwind; Max Pool Size=75; Min Pool Size=5" ASP.NET数据库连接池摘要 连接池允许应用程序从连接池中获得一

Java实现数据库连接池的方法_java

本文实例讲述了Java实现数据库连接池的方法.分享给大家供大家参考.具体如下: package com.kyo.connection; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import j

扩展Hibernate使用自定义数据库连接池的方法_java

本文实例讲述了扩展Hibernate使用自定义数据库连接池的方法.分享给大家供大家参考,具体如下: 在Hibernate的过程中往往碰到这样的问题:我们现成的产品本来已使用自有的数据库连接池,同时使用Hibernate的话在Hibernate配置中也得配置数据库连接信息,这样就需要在两个地方维护数据库连接信息,维护起来感觉相当别扭. 由于我们不是在产品刚开始开发就加入Hibernate的,所以不合适让产品直接使用Hibernate的连接池,只好让Hibernate来使用产品自有的连接池,还好Hi