最近做了个网站,纯JSP的,用了连接池,数据库是MSSQL2000,网站已经上线运行了,但是很奇怪每过一个星期网站就会死掉一次,我上服务器一看,内存全部被MSSQL占用满了(服务器内存有1G),我重新启动下服务网站又好了。而且还有件很怪的事,我TOMCAT的根目录下,有大量.tmp文件。

解决方案 »

  1.   

    连接池的关闭上有问题吧
    finally{try{
    if(rs!=null)
    rs.close();
    if(stmt!=null)
    stmt.close();
    if(conn!=null)
    conn.releaseConnection(defaultname,con);
    }catch(Exception e){
    e.printStackTrace();
    }
    }
      

  2.   

    .tmp文件是什么内容,日志?????????
      

  3.   

    你连接池是用的tomcat的吗,会不会每关闭连接阿
      

  4.   

    是的,数据库的连接上有问题!!另外,你最好限制你的SQL Server的内存!!
      

  5.   

    检查程序保证连接都关闭,然后配置server。xml,使max和min能很好的搭配工作
      

  6.   

    都关了,只是关Connection对象和1楼的不一样,我是conn.close()
    请问conn.releaseConnection(defaultname,con)有什么不同吗?
      

  7.   

    连接没关,这是一个方面
    初始化对象后,没有清除对象,set ....=null
      

  8.   

    希望楼主把连接池的完整代码贴出来,因为每个人可能都会实现连接池,但是其性能却大不一样,比如说楼主为什么要conn.close()呢,那不是违背了连接池的初衷了么,连接池在初始化时申请的连接应该在垃圾回收之前的finalize()方法里面啊!!
    200分呢!总会有高手过来,让高手们点评一下,也可让大家学习一下!学习中!
      

  9.   

    呵呵,连接池的问题
    老问题了
    MSSQL好像可以查有几个数据库连接和连接多久
    用多少内存但是语句就忘记了
      

  10.   

    搂主的问题我遇到过,应该限制一下 SQL Server 使用内容的上限。1. SQL Server 会优化自己,自动占用更多的内存提高数据库的效率,这一点是对的。2. 不过:对于一个服务器上不只是 SQL Server 来说,数据库的效率的确是提高了,但是其他程序受到了影响,仅数据库快是没有用的。3. 数据库 -> 属性 -> 内存 -> 动态的配置 -> 最大值。调整到 1/3 就够了。
      

  11.   

    限制一下 SQL Server 使用内容的上限。支持!
      

  12.   

    很明显,数据库的连接释放问题。原来一个项目数据库是oracle也出现过类似问题...
      

  13.   

    数据库的连接释放掉,同时优化sql server
      

  14.   

    先谢谢大家对我的支持!
    我用的是proxool连接池,proxool包里有个Servlet类AdminServlet,可以查看当前连接情况(显示当前是否有连接没关),我在网站上线前每打开一个页面就查看下这个Servlet,但是所有的连接都是关了的,<%@ include file="common/connection.jsp"%>
    <%
    ResultSet rs = null;
    try {
    rs = stmt.executeQuery(sql);
    if(rs.next()){
                 //do Something;
             }
    }
    finally {
    rs.close();
    stmt.close();
    stmt1.close();
    conn.close();
    }
    %>
    基本上每个页面都是这样处理的,有的页面逻辑复杂的,就多几个这样的try块。
      

  15.   

    connection.jsp如下  
    Connection conn = null;
    Statement stmt = null;
    Statement stmt1 = null;
    try {
    conn = DriverManager.getConnection("proxool.web");
    stmt= conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    stmt1= conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    }
    catch(Exception e) {
    return;
    }
      

  16.   

    除了以上大家说的外,觉得可能还有几处要注意的:
    1  mssql对于用jdbc连接的java应用不是太好,个人觉得mysql可能还更加合适
    2  另外对于tomcat的内存使用配置也可能要作相应的调整
    3  也许程序中其他的地方(不光是数据库连接池),如线程,文件读写,socket联接同样也会造成内存泄漏
      

  17.   

    在finally里关闭conn,关闭rs,并把它们都置为null,不要用gc()
      

  18.   

    限制一下 SQL Server 使用内容的上限。搂主没有看到前面的回复吗?
      

  19.   

    不见得是数据库连接方面的问题,因为JAVA的垃圾回收是相当宽容的,也就是对于程序员来说是“傻瓜”式的。用过连接池的应该知道,连接用完最好当然是关,但是不关也不会怎么地。楼主用的是开源连接池么?为什么不用应用服务器的?推荐用后者的。
    .tmp文件里是什么内容?
      

  20.   

    你的代码有问题:
    finally {
    rs.close();
    stmt.close();
    stmt1.close();
    conn.close();
    }你想想如果rs或者stmt是null,则在finally里面又得到一个空指针异常,后面的语句不能执行,所以代码最好改成:
    finally {
    if(rs!=null) rs.close();
    if( stmt!=null) stmt.close();
    if(stmt1!=null) stmt1.close();
    conn.close();
    }
      

  21.   

    你那个tmp文件到底是干什么的,临时文件吗?现在我最现实的是先限制一下sqlserver的内存使用上限!完了你在仔细看看你的代码了,优化一下!
      

  22.   

    http://www.sysinternals.com 上下载一个 Process Explorer 可以看 某个进程打开了多少个 TCP/UDP 端口或连接,这样你就可以看 tomcat5.exe 总共打开了多少个数据库连接。
      

  23.   

    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
    怎样限制sqlserver的内存使用上限?
      

  24.   

    SQL SERVER会自动增加使用的内存,限制使用上限就是如楼上说的:
    数据库 -> 属性 -> 内存 -> 动态的配置 -> 最大值。调整到 1/3 就够了。
    最好是SQL SERVER单独使用一台机器做数据库服务器。
    配置连接池时最好也设置一次打开连接的最大与最小数目。
    根目录下有大量的TMP文件,肯定是程序问题,建议看一下TMP的名字,然后找一下源代码,看是否源代码里面重复生成了该文件