不好意思登陆页面有点问题,现重贴如下:
<%@ page language="java" import="java.sql.*"%>
<%@ page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="db" scope="page" class="my.DB"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title></title>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<%
  request.setCharacterEncoding("gb2312");
  String name=request.getParameter("user_logname");
  String password=request.getParameter("password"); 
  String strcount="";  
  String sql="";  
  ResultSet rs=null;
%>
<% 
   
sql="select * from user1 where user_logname='"+name+"' and password='"+password+"'";
rs=db.executeQuery(sql);
     
if(!rs.next())
   {
%>
   <center><h3>输入的用户名、密码错误!!!!请重新登录!!!</h3></center>
<%

     rs.close();
     db.close_all();
}
   else{
         
   
 //if(session.isNew()){
   session.setAttribute("user_ID",rs.getString("user_ID"));
       session.setAttribute("user_type",rs.getString("user_type"));
   session.setAttribute("user_name",rs.getString("user_name"));
   session.setAttribute("password",rs.getString("password"));
   session.setAttribute("department",rs.getString("department"));
   session.setAttribute("user_logname",rs.getString("user_logname"));
   strcount=rs.getString("user_Count");   //下面是增加用户的登陆次数
       if(strcount==null){
       strcount="0";
        }
       int count=Integer.parseInt(strcount);
   count++;
   strcount = new Integer(count).toString();
   session.setAttribute("user_Count",strcount);
   String user_ID=(String)session.getAttribute("user_ID");     
   sql="update user1 set user_Count ='"+count+"' where user_ID='"+user_ID+"'";
            db.executeUpdate(sql); 
            rs.close();
   db.close_all();    
     //}  
    response.sendRedirect("teacher.jsp");
   }
 
%>
</div>
</body>
</html>

解决方案 »

  1.   

    查找  finally 没有找到,所以说你的代码有问题,当查找 遭遇 SQLException 或者 RuntimeException 时,你的 rs / conn 连接就没有关闭,会一直悬挂到超时, 这样会用光
    数据库的 游标 ( 对应到 ResultSet ) ,所以数据库会表示反抗。Oracle 的错误消息可能更容易看懂:中文的是 : 用尽的 ResultSet.
      

  2.   

    把所有你能够干预的 异常都 try { } catch(Exception e){} finally{ closeAll();}JSP 已经是调用端的最末端,所以要捕获所有的异常,也应该保证有没有异常都一定要关闭连接,释放所有应该释放的资源。
      

  3.   

    请问楼上的,
    1.我的那个javabean的结构是不是正确的?一般对数据库访问的javabean是如何写?
    2.由于我在javabean中获取记录集的时候已经用到了try{}catch{}finally{}结构,难道在jsp中使用javabean的时候也要用到此结构?
    可能我的问题的原因正如你所说的那样,但是你那种情况也应该在异常情况出现的时候发生,为什么实际中是正常访问的时候也遇到呢?
    还请多多指教,谢谢!
      

  4.   

    1.
    public ResultSet executeQuery(String sql) throws Exception {
            rs = null;
            try {
                Context initCtx = new javax.naming.InitialContext();
                Context envCtx = (Context) initCtx.lookup("java:comp/env");
                DataSource ds = (DataSource) envCtx.lookup("jdbc/bn");
                con = ds.getConnection();
                stmt = con.createStatement();
                rs = stmt.executeQuery(sql);
            }
            catch (SQLException e) {throw e; }
            catch (NamingException e) {throw e; }
            finally{ // 关键,你的代码没有这个,任何时候都应该确保关了,正常还是不正常。
                 有错误应该写日志,不要再抛,如果是更新就先回滚,到这里了有错误几乎都是不可恢复的错误,你的事情已经干完了,剩下的是没有办法完成的。
               if ( rs!=null )try{ rs.close();catch(Exception e){ // 写日志}
               if ( conn !=null )try{ conn .close();catch(Exception e){ // 写日志}
            }
                      return rs;
        }2. 你的代码 ,SQLException 没有人处理,所以 JSP 一定要处理(清理因异常而没有关闭释放的资源), Servlet 正在执行时,用户在 IE 中 按了 Esc 或其他网络故障,服务器依然会继续执行完,但是这个错误用户浏览器断开了连接所以没有看到 500, 如果服务器也没有打印日志那么就没有人亲眼看到这个错误曾经发生过。
      

  5.   

    但是有个问题是:如果在javabean中用finally关闭了rs的话,那么在javabean 中的查询方法就不能返回查询的结果记录集rs!请问到底访问数据库的javabean的结构应该如何写?谢谢!
      

  6.   

    System.err.println("执行SQL语句出错: " + ex.getMessage());
    错了
      

  7.   

    但是有个问题是:如果在javabean中用finally关闭了rs的话,那么在javabean 中的查询方法就不能返回查询的结果记录集rs!请问到底访问数据库的javabean的结构应该如何写?谢谢!从resultset中把数据读出来放在一个其他的自己定义的数据结构里。正常的程序应该是哪里打开连接就在哪里关闭——说的是连接——连连接都要关,更别说你那个下面的resultset了……
      

  8.   

    你做一个javabean A ,结构与数据库的结构一致。
    不要返回ResultSet,返回A的集合就行了
      

  9.   

    可不可以在javabean中返回查询所得的记录集rs?然后在jsp中用try{}catch{}finally{}结构?因为这样的话能够使javabean访问数据库更加通用!不知道这样用有没有问题?
      

  10.   

    那么对每一个数据库表都要写一个javabean的话,javabean的通用性不是就得不到体现了,还不如不用javabean来访问数据库,直接在每个jsp中访问数据库?
    请高手指点!谢谢
      

  11.   

    public Oracle(){
        this.database = "jnpc";
      }
    /**
       * 从连接池中返回一个数据库连接
       * @return
       */
     public static Connection getConnection() {
        Connection connection = null;
        try {
          InitialContext initContext = new InitialContext();
          String strDataSourceName = "jdbc/"+database;
          DataSource dsOracle = (DataSource)initContext.lookup(strDataSourceName);
          connection = dsOracle.getConnection();
        } catch(Exception e) {
          System.out.println("xzsfw:Oracle.java-->getConnection:" + e.getMessage());
        }
        return connection;
      }/**
       * 完成数据库的增删改操作,要求传入的sql语句必须为insert,update或delete
       * 有返回值,-1表示操作不成功,0表示没有更新行,正整数代表更新的行数
       * @param sql
       */
    public int update(String sql) {
        Connection conn = getConnection();
        Statement  stmt = null;
        int result = 0;
        try {
          stmt = conn.createStatement();
          conn.setAutoCommit(false);
          result = stmt.executeUpdate(sql);
          stmt.close();
          conn.commit();
          conn.setAutoCommit(true);
          conn.close();
          return result;
        } catch(SQLException e1) {
          System.out.println("xzsfw:Oracle.java-->update(String sql" + sql+") e1:" + e1.getMessage());
          try{
            conn.rollback();
            conn.setAutoCommit(true);
            return -1;
          } catch(SQLException e2) {
            System.out.println("xzsfw:Oracle.java-->update(rollback) e2:" + e2.getMessage());
            return -1;
          }
        } finally {
          this.disconnect(stmt, conn);
        }
      }/**
       * 返回多行多列查询结果
       * @param sql
       * @param colArr
       * @return
       */
      public String[][] getMultiRowMultiCol(String sql) {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
        Vector v = new Vector();
        int colCount=0;
        try {
          conn = getConnection();
          stmt = conn.createStatement();
          rs = stmt.executeQuery(sql);
          ResultSetMetaData rsmd = rs.getMetaData();
          colCount=rsmd.getColumnCount();
          while (rs.next()) {
            String[] arr = new String[colCount];
            for (int i = 0; i < colCount; i++) {
              arr[i] = rs.getString(i+1);
            }
            v.addElement(arr);
          }
        } catch(Exception e) {
          System.out.println("Oracle.java-->getMultiRowMultiCol:" + e.getMessage());
        } finally {
          this.disconnect(rs, stmt, conn);
        }
        return this.cvtVtrToArr(v, colCount);
      }
      /**
       * 将Vector转换为一个二维数组
       * @param v
       * @param colCount
       * @return
       */
      public String[][] cvtVtrToArr(Vector v, int colCount) {
        Object[] obj = v.toArray();
        int rowCount = obj.length;
        String[][] arr = new String[rowCount][colCount];
        for (int i = 0; i < rowCount; i++) {
          arr[i] = (String[])obj[i];
        }
        return arr;
      }供参考
      

  12.   

    通过      
    ResultSetMetaData rsmd = rs.getMetaData();
    colCount=rsmd.getColumnCount();
    while (rs.next()) {
            String[] arr = new String[colCount];
            for (int i = 0; i < colCount; i++) {
              arr[i] = rs.getString(i+1);
            }
    获取数据库表的内容确实不错,不过用ArrayList可能更好一点,不用再进行下面的转二维数组!
    另外问一个关于try{}catch{}finally{}结构的问题:
    在finally{}中关闭记录集,连接的时候也要用到try{}catch{}结构,那么是否还需要finally呢?如果关闭失败的话,还是会存在资源关闭不了的情况?如果有finally的话,那么这个结构可能就会没止境了!不知我的说法是否正确?请指点!
    另外各位在jsp中用javabean的时候的scope用的是什么?page还是session?