其实这些都是系统自己做的
一个连接做完以后自动把资源返回到连接池中
等待下一个连接来调用老大,不要误导人哟
使用完之后调用conn.close();就是把这个连接释放到池中~而不是真把这个连接关了
因为Connection本身就是一个接口,具体close()方法怎样实现的与具体驱动有关~
一个连接做完以后自动把资源返回到连接池中
等待下一个连接来调用老大,不要误导人哟
使用完之后调用conn.close();就是把这个连接释放到池中~而不是真把这个连接关了
因为Connection本身就是一个接口,具体close()方法怎样实现的与具体驱动有关~
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的话就不出错!
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)
既然你确定是在调用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)
{
}
该文件如下:
<%@ 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>
你还没用完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被关闭的话
数据库连接已经丢失了,还怎么从中提取记录呢
Bean0.stateclose()
应写在finally里
既然你已经把stmt和conn关闭了,在以后的页面中怎么还能够查到结果呢?
于是得到的rs=null==>rs.next()报错建议使用这个bean用page方式
<jsp:useBean id="sbean" scope="page" class="sqlBean.sqlBean" />
页面结束时关闭连接
后面页面中需要使用数据库时,再使用这个标签,产生新的sqlBean实例,获得新的连接当然,你不关闭连接也可以达到目的
但你长时间占用了资源
而如果当前页面被关闭,连接就一直不会被释放
(我有事先闪了)