我觉得freeConnection中有问题:你怎么可以把Connection给close掉呢?这不是你该做的事情,这是连接池做的。事实上你把这个Connection给close掉了,那么这个connection对于ConnectionPool就没有用了。我想你的意思大概是con.commit()才对吧?另外,ConnectionPool的代码在哪里?

解决方案 »

  1.   

    为什么不用web服务器的连接池?
    就不应该有这么多问题了
      

  2.   

    我上周也解决了一个几乎一模一样的问题。
    我的解决思路是:
    1)从连接池获取连接时,将获取时间记录下来。
    2)这样就可以得到一个连接被使用的时间。
    3)每次有释放连接的需求产生时,去检查一次有无超时的连接(我自己设定的是10分钟),如果有,就自动释放掉。
    这样就可以保证不会因为太多的异常连接导致缓冲池被占满。
    我自己实际还改写了获取连接的页面(我是struts的action里面),多传递一个connUser进去,这样就可以配合监控页面实时显示当前有那个类正在使用那个连接。
    楼主按照这个思路改改吧,应该不难的,实在不行,可以再联系我。
      

  3.   


    继承  http lisenter  要是没有 http 请求 自动关闭连接!
      

  4.   

    你将freeConnection向下面的方式写看看,
    public void freeConnection(String name, Connection con)
      {
        try{
         if(con != null){
           con.commit();
           con.close();
         }
         con == null;
        }catch(Exception e){
        }
      }如果你不能保证每个JSP页面中都会调到该方法(当然这个页面中有获取连接的语句)那你最好还是
    改写你的DBConnectionManager,然后开起一个新的线程,然后按照s_phoenix说的思想去解决吧。
    可能利用AOP方面的一些思想也能解决该问题,但这样可能就把问题复扎花了
    关键是你们写JSP代码的人,在JSP页面中最终一定会调用到这个方法。
    这种写JSP的方法,好像以前在新致时大家这么些。唉不说了
      

  5.   

    搂主的意思,我大概明白,好像是要做一个匹配查找.来找出未施放连接的jsp页面
    其实就是一个查找是否获得连接或释放连接是匹配的问题.
    //其中的参数很明白.改个路径运行即可.///////吧以前的一个代码统计类给你改吧了改吧.可以用了..
    import java.io.*;
      import java.util.*;public class Untitled1 {
      public Untitled1() {
      }
      public static void main(String[] args) {
        Untitled1 untitled11 = new Untitled1();
        List list=new ArrayList();
        list=untitled11.getCodeRows(new File("c:\\test\\"),".jsp,.java,.class",false,list);
        if(list!=null){
          for(int i=0;i<list.size();i++){
            System.out.println("没有匹配的文件路径和文件名称:"+list.get(i));
          }
        }  }  /**
         *统计代码的行数
         * @param file 文件或目录
         * @param FileterStr 要统计的文件的后缀名的字符串:例如:".java,.jsp,.html.js,.css"
         * @param isBlankLie 是否统计空行,true:空行也算一行,false:空行不算
         * @return count 统计得到的行数。
         */
        public List getCodeRows(File file, String FileterStr,boolean isBlankLine,List list) {
          long count = 0;
          if (file.isDirectory()) {//如果是目录
            System.out.println("path=" + file.getPath());
            String[] subfiles = file.list(new FileFileter(FileterStr));
            System.out.println("子文件和文件夹的个数="+subfiles.length);
            if (subfiles != null) {
              for (int i = 0; i < subfiles.length; i++) {
                File subfile = new File(file.getPath() + "\\" + subfiles[i]);
                if (subfile.isDirectory()){      //递归遍历文件目录
                 this.getCodeRows(subfile, FileterStr,isBlankLine,list);
                }
                else      //统计一个文件的代码航数
                  list.add(this.countRows(subfile,isBlankLine));          }//for        }//if (subfiles != null)      }//
          else {//如果是文件
            //统计一个文件的代码航数
                  list.add(countRows(file,isBlankLine));      }      return list;    }    /**
         * 统计一个文件中的行数
         * @param file
         * @return
         */
        private String countRows(File file,boolean isBlankLine) {
          boolean flag=false;
          try {
            java.io.BufferedReader breader = new java.io.BufferedReader(new java.io.
                FileReader(file));
            if (breader != null) {
              String s=null;
              while ((s=breader.readLine())!= null) {
                if (isBlankLine || s.length() > 0)//统计或不统计空行
                {
                  if (s.indexOf("getConnection") != -1)
                    flag = true;
                  if (s.indexOf("freeConnection") != -1)
                    flag = false;
                }
                s = null;
              }
              breader.close();;
            }
          }
          catch (IOException ex) {
            ex.printStackTrace();
          }
          if(flag)
          return file.getPath()+"===="+file.getName();
        else
          return null;    }    /**
         *内隐类
         * <p>Title: 文件名过虑类,主要用于过虑要统计的文件</p>
         * <p>Description: </p>
         * <p>Copyright: Copyright (c) 2004</p>
         * <p>Company: 乐开工作室 http://blog.csdn.net/shaokun305 </p>
         * @author 陈少坤
         * @version 1.0
         */
        class FileFileter implements java.io.FilenameFilter
        {
          String filename;
          FileFileter(String filename){
            this.filename=filename;
          }      /**
           * 实现那个filenameFileter的accept接口
           * @param dir
           * @param name
           * @return
           */
          public boolean accept(File dir, String name) {
            boolean flag = false;
            String filetername[] = filename.split(",");
            if (filetername != null) {//如果是
              for (int i = 0; i < filetername.length; i++) {
                if (name.indexOf(filetername[i]) != -1) {
                  flag = true;
                  break;
                }
              }
            }
            else//如果过虑字符串为null,则都统计。
            flag=true;
            if (dir.isDirectory())//如果是目录都需要获得进行统计
              flag = true;
            return flag;      }    }  }