贴一个书上说的共享连接的例子:<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<HTML>
<BODY>
 <%! //声明一个共享的连接对象:
    Connection con=null;
  %>
 <% Statement sql=null; 
    ResultSet rs=null; 
    //第一个客户负责建立连接对象:
    if(con==null)
      { try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           }
           catch(ClassNotFoundException e)
           {out.print(e);
           }
        try {con=DriverManager.getConnection("jdbc:odbc:moon","sa","");
           sql=con.createStatement();
           rs =sql.executeQuery("SELECT * FROM students");
           out.print("i am  first");
          }
        catch(SQLException e) 
          {out.print(e);
          }
      }
     //其它客户通过同步块使用这个连接:
     else
      { synchronized(con)
        {  try { sql=con.createStatement();
               rs =sql.executeQuery("SELECT * FROM students");
               out.print("i am not first");
               }
          catch(SQLException e) 
               {out.print(e);
               }
        }
      }
    try
      {  out.print("<Table Border>");
         out.print("<TR>");
            out.print("<TH width=100>"+"学号");
            out.print("<TH width=100>"+"姓名");
            out.print("<TH width=50>"+"数学成绩");
            out.print("<TH width=50>"+"英语成绩");
            out.print("<TH width=50>"+"物理成绩");
         out.print("</TR>");
       while(rs.next())
       { out.print("<TR>");
           String  number=rs.getString(1); 
             out.print("<TD >"+number+"</TD>"); 
           String  name=rs.getString(2); 
             out.print("<TD >"+name+"</TD>");
           int  math=rs.getInt("数学成绩"); 
             out.print("<TD >"+math+"</TD>"); 
           int  english=rs.getInt("英语成绩"); 
             out.print("<TD >"+english+"</TD>");
           int  physics=rs.getInt("物理成绩"); 
             out.print("<TD >"+physics+"</TD>");   
        out.print("</TR>") ;          
        }
      out.print("</Table>");
    }
   catch(SQLException e1) {}
 %>
</BODY>
</HTML>

解决方案 »

  1.   

    如果用数据库连接池是不是就不能conn.close?
      

  2.   

    用用数据库连接池也要conn.close
      

  3.   

    放弃你的这个设计, 除非你是在CS模式下工作。 顺便说一下,一直不关也会在一定的时间后连接过期失效。
    ========================================================================================
    为什么BS下不行?
      

  4.   

    我把书上“使用同步连接”这一段说明打了一下:  数据库操作中,建立连接是耗时最大的操作之一。如果客户访问的是同一数据库,那么,为每个客户建立一个连接是不合理的。…………(略去了几行)…………当多个客户请求一个jsp页面时,jsp引擎为每个客户启动一个线程而不是启动一个进程,这些线程由web服务器进程来管理,它们共享jsp页面的成员变量。在处理多线程问题时,可以将线程变量放入一个synchronized块,这样,当一个客户用synchronized块修改一个共享变量时,其他线程就必须等待,直到该线程执行完该同步块。这样,我们可以把Connection对象作为一个成员变量被所有的客户共享,也就是说第一个访问数据库的客户负责建立连接,以后所有用户共享这个连接。          ---出自《jsp实用教程》P164 清华大学出版社
      

  5.   

    这是另一本书上半于共享连接的一段话:  因为关闭连接connection.close()的开销常常很大,故而,如果希望执行额外的数据库操作,应该延迟关闭数据库,实际上,重用已有的连接是一件重大的优化,JDBC2.0API甚至专为获取共享连接定义了ConnecionPoolDataSource接口。
                     ---出自《Servlet与JSP核心编程》P358 清华大学出版社
      

  6.   

    请教super_zzw(之支吾) 是怎么解决这个问题的。
      

  7.   

    TO:super_zzw(之支吾)
    多谢 ,我去找找看。
    另:能不能简单介绍一个连接池,谢谢。