其实这些都是系统自己做的
一个连接做完以后自动把资源返回到连接池中
等待下一个连接来调用老大,不要误导人哟
使用完之后调用conn.close();就是把这个连接释放到池中~而不是真把这个连接关了
因为Connection本身就是一个接口,具体close()方法怎样实现的与具体驱动有关~

解决方案 »

  1.   

    我写了一个BEAN,在jsp中调用stateclose(),tomcat报错,大家帮忙看一下!!
    package sqlBean;import java.io.PrintStream;
    import java.sql.*;
    import java.io.*;
    import javax.sql.DataSource;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.naming.Context;public class sqlBean
    {
        Context ctx;
        DataSource ds=null;
        Connection conn = null;
        Statement stmt=null;
        ResultSet rs=null;    public sqlBean()
        {
        try{
            ctx = new InitialContext();
            Context envContext  = (Context)ctx.lookup("java:/comp/env");
            ds = (javax.sql.DataSource)envContext.lookup("jdbc/zstjoracle");
            conn = ds.getConnection();
            stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            }
        catch(Exception e)
          {
          System.out.println("数据库连接错误:"+e);
          }
        }    public boolean  executeInsert(String sql)
        {
            try
            {
              stmt.executeUpdate(sql);
              return true;
            }
            catch(SQLException ex)
            {
                return false;
             }
        }    public boolean  executeDelete(String sql)
        {
            try
            {
              stmt.execute(sql);
              return true;
            }
            catch(SQLException ex)
            {
            System.out.println(ex.toString());
                return false;
             }
        }    public ResultSet executeQuery(String sql)
        {
            rs = null;
            try
            {
              rs = stmt.executeQuery(sql);
            }
            catch(SQLException ex)
            {
              rs=null;
            }
            return rs;
        }
            public void stateclose()
        {
            try
            {
             stmt.close();//要不要???
             conn.close();
             }
            catch(SQLException ex)
            {
            System.out.println(ex.toString());
            }
        }
    }
    但是不调用BEAN的话就不出错!
      

  2.   

    其实我不明白怎么才算释放资源, stmt.close()  conn.close()就等于释放了???
      

  3.   

    那位高手帮我看看阿,为什么调用javabean里面的stateclose(),TOMCAT 会报错!!
      

  4.   

    哦,打听一下:tomcat报的是什么错?
      

  5.   

    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)
    at java.lang.Thread.run(Thread.java:536)
    root cause java.lang.NullPointerException
    at org.apache.jsp.login_jsp._jspService(login_jsp.java:132)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)
    at java.lang.Thread.run(Thread.java:536)
      

  6.   

    jsp报的是java.lang.NullPointerException,即空指针错误
    既然你确定是在调用sqlBean.stateclose()时出错的
    这说明jsp中的sqlBean在这之前就已经是null了,这不太可能
    要么,就是stateclose()中出现了无法捕捉的Exception
    而你的stateclose()中的确只捕捉了SQLExcpeion而已
    所以,这个NullPointerException是出自stateclose()
    所以我想,正如你怀疑的那样,在关闭stmt时出错了我以前碰到过类似的情形,是在关闭rs时碰到的
    在关闭之前,我先做了query,之后又作了update建议:
    1、捕捉Excepion,而不是SQLExcepion
    2、为了保证conn总能正常关闭,把stmt与conn分开关闭,如下所示//关闭stmt
    try
    {
    if (stmt != null) 
    {
    stmt.close();
    }
    }
    catch(Exception ex)
    {
    }
    //关闭con
    try
    {
    if (con != null)
    {
    con.close
    }
    }
    catch(Exception ex)
    {
    }
      

  7.   

    这样我也试过,出错在还没有调用sqlBean.stateclose()之前的rs.next();但是我只要在后面不调用sqlBean.stateclose()它就不会出错!!!
      

  8.   

    还没有执行到哪里去阿
    该文件如下:
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.sql.*" %>
    <%@ page errorPage="error_dlcs.jsp" %>
    <% request.setCharacterEncoding("GB2312");%>
    <html>
    <head>
    <title>
    checked
    </title>
    </head>
    <jsp:useBean id="Bean0" scope="session" class="sqlBean.sqlBean" />
    <jsp:setProperty name="Bean0" property="*" />
    <body background="images/IndustryBG.gif" >
    <%
    try{
    String user=request.getParameter("users");
    String pasw=request.getParameter("pas");
    String zydm=request.getParameter("zydm");
    String sql="select * from userk where qyfrdm='"+user+"' and passwords='"+pasw+"' and zydm='"+zydm+"'";
    ResultSet rs = Bean0.executeQuery(sql);
    if(rs.next())
    {
      String qymc=rs.getString(2);
      String qx=rs.getString(5);
      String zqdm=rs.getString(6) ;
      int int_qx=Integer.parseInt(qx);
        session.setAttribute("user",user);
      session.setAttribute("zydm",zydm);
      session.setAttribute("zqdm",zqdm);
      session.setAttribute("qymc",qymc);
      session.setAttribute("qyfrdm",user);
      session.setAttribute("passwords",pasw);
      session.setAttribute("qx",qx) ;
      rs.close();
    Bean0.stateclose();//不调用就没事,调用了之后其他别的页面都不能通过sqlbean连接数据库
       if(int_qx==1)
       {response.sendRedirect("xtmanage.jsp") ;}
       else if (int_qx==2)
       {response.sendRedirect("index.htm") ;}
       else if (int_qx==3)
       {response.sendRedirect("zjmanage.jsp") ;}
       else
       {response.sendRedirect("loginerr.jsp");}
    }
    else
    {
      response.sendRedirect("loginerr.jsp") ;
    }    }
    catch(Exception e)
    {
      response.sendRedirect("xterror.htm") ;
    }%>
    </body>
    </html>
      

  9.   


    你还没用完rs就把rs关闭、调用Bean0.stateclose()了
    这样的话
    假如你的查询结果多于一条记录,必然报NullPointerException
    因为,你在第二次执行rs.next()的时候,rs已经是null了我向来是在finally里关闭连接的
    try{
    }catch(Exception ex)
    {}
    finally
    {}
    Bean0.stateclose()还有,执行了sqlBean.executeQuery后,并不能立即关闭stmt和conn
    应该在rs使用完之后关闭这些资源
    因为,你返回的rs只是个指针,并没有实际数据
    假如stmt、conn被关闭的话
    数据库连接已经丢失了,还怎么从中提取记录呢
      

  10.   

    写错了:
    Bean0.stateclose()
    应写在finally里
      

  11.   

    你是在sqlBean初始化时建立的连接
    既然你已经把stmt和conn关闭了,在以后的页面中怎么还能够查到结果呢?
    于是得到的rs=null==>rs.next()报错建议使用这个bean用page方式
    <jsp:useBean id="sbean" scope="page" class="sqlBean.sqlBean" />
    页面结束时关闭连接
    后面页面中需要使用数据库时,再使用这个标签,产生新的sqlBean实例,获得新的连接当然,你不关闭连接也可以达到目的
    但你长时间占用了资源
    而如果当前页面被关闭,连接就一直不会被释放
    (我有事先闪了)