具体情况如下:服务器用的是TOMCAT5.5.12我在ODBC数据源中设置好了SQL SERVER 2000数据库连接,用JAVABEAN连接数据库
代码如下:
=====================
package opendb;
import java.sql.*;
public class openCUSTOMS
{
String sDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr="jdbc:odbc:customs";
Connection conn=null; Statement stmt=null;
ResultSet rs=null;
public openCUSTOMS()
        {
try
{
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e)
{
System.err.println("opendb():"+e.getMessage());
}
}
public ResultSet executeQuery(String sql)
{
rs=null;
try
{
      conn=DriverManager.getConnection(sConnStr,"sa","sa");       stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs=stmt.executeQuery(sql);
}
catch(SQLException ex){
System.err.println("aq.executeQuery:"+ex.getMessage());}
return rs;
}
}
===============
然后在页面中:
===============
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<jsp:useBean id="DBcustoms" scope="page" class="opendb.openCUSTOMS"/>
<%
     String sql="............";
     ResultSet rs=DBcustoms.executeQuery(sql);
     ...................
%>
===============
页面的访问和数据的读出,显示都很正常
但是TOMCAT在运行短则一天,长则四五天 会出现以下报错,主要内容如下(是在服务器端的报错)===============
一般性网络错误。请检查网络文档。 
===============
在页面显示一些NULLPOINTEXCEPTION之类的错误在WEB页发生错误的同时,公司有一些有客户端程序(C/S的)也是连到这个SQL SERVER上的,会出现数据库连接数目达到最大的报错,(设置为200个)每次都只需要重新启动TOMCAT一切就都恢复正常了,所以我怀疑是TOMCAT上产生的数据库连接没有及时的得到释放,查了两天资料都没有什么进展我想请教下产生这种错误的原因是什么?如果是数据库连接的问题的话,能否说明下怎样才能正确而且有效的将数据库的连接释放,我查阅过一些关于数据库连接池的文档,是用JNDI来直接连接SQL SERVER的,而且都是在TOMCAT里配置数据库连接池ODBC数据源的数据库连接池应该怎样配置?并且将数据库连接有效的利用并且合理释放谢谢

解决方案 »

  1.   

    你的程序没有用到连接池,这是最基础的JDBC连接数据库的写法conn表示连接对象,rs表示返回的结果集对象,还有stmt在使用完都要关掉,尤其是conn对象,运行一次占用一个连接,使用完要将其关掉把连接资源还给数据库rs.close();
    stmt.close();
    conn.close();不过在JSP+JavaBean这样的结构中完成这种操作的代码比较麻烦,所以页面之间最好是传递一个JavaBean对象而不是rs
      

  2.   

    每次实例化openCUSTOMS就要去实现一个Connection,估计是这里出的问题.Connection应该是只实现一次,如果每次实例化就实现一个Connection,那么就有可能出现以上情况.
      

  3.   

    企图封装一个类似Connection的类来完成Statement的功能是不合适的。这样的封装意义不大。不过也不是不可以,但我见过的能用的也就是《jsp设计》的作者写的一个类。你这样做无法获得Connection的handler,你就无法关闭它。如果你在内部关闭了,你就无法在外面查询。当然你可以写一个方法来关闭它们。     String sql="............";
         ResultSet rs=DBcustoms.executeQuery(sql);这种用法仅仅是代码级别的。对程序的复用性、可读性、安全性毫无益处。仅仅是使自己少写了几行代码而已。
    http://community.csdn.net/Expert/topic/4462/4462423.xml?temp=.3180353说了很多废话哈。总之你应该在finally块中关闭ResultSet、Statement和Connection
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try{
      //do some work...
    }finally{
      if(rs!=null)rs.close();
      if(st!=null)st.close();
      if(conn!=null)conn.close();
    }如果这段代码完全属于你的商务逻辑并且你能确定如何处理异常,那么就捕获,否则就抛出,但是finally不可以少。
      

  4.   

    记得在关闭的时候也要捕获*.close();的异常。