程序大概如这样:
class X

   X(){ conn = opendb; }
   execute(){}
   finalize(){ conn.close(); }   main(){
     x = new X();
     x.execute(...);
   }
}但finalize根本无法保证能不能被调用.我打开了一个access数据库作测试, 结果果然发现程序运行完后, 那个作为连接的ldb文件没有被自动删除掉, 真是郁闷! 手动去调用finalize才删掉。既然finalize根本无法保证能否被调用, 还弄出这个方法干嘛啊, 文档上说虽然我们可以有garbage collection, 但还需要用它来关闭socket等. 它都不能被调用了, 还怎么关闭啊!当然,我们可以手动去调用它。那还有什么意义啊,不如写个close函数来的更清晰!更要命的是,我在JSP中用JAVABEAN的形式去用它(SCOPE是SESSION),我哪里知道什么时候该去关闭啊。(难道要在jspDestroy中写?)我学JAVA不久,还不是很懂,是不是java确实无法提供自动的析构呢?

解决方案 »

  1.   

    在你的X类(有finalize方法)对象赋为null,通过System.gc()会自动调用finalize方法,
    你这里没有执行这个方法是因为还有对象没有被清空,
    看thinking in java,上面有讲
      

  2.   

    class X

       X(){ conn = opendb; }
       execute(){}
       finalize(){ conn.close(); }   main(){
         x = new X();
         x.execute(...);
         //---------
        x=null;
        System.gc();
       }
    }
      

  3.   

    > believefym(暮色,miss,迷失,miss) 1。你的意思是说我必须在程序结束前加上两句才能析构:
    x = null;
    System.gc();可是这样,似乎还不如直接调用x.finalize()或写一个x.close()直接和方便。2。现在我的意思关键是不想显式地去写个关闭连接的代码或强制回收的代码,想让程序自动去完成关闭连接的调用。这有可能实现吗?3。另外,为什么我的程序已经都退出了,还有对象没有被清空呢?
      

  4.   

    退出的时候对象还没有清空呢
    一般的连接比如数据库、io等都需要自己close
      

  5.   

    public void init() throws Exception;
    public void destroy();
      

  6.   

    不要考虑finalize方法,而且你永远不能预计到它什么时候会被执行绝大部分(如果不是所有)的有初始化,清空操作的程序都应该是利用在某处try-finally而不是设计成利用构造函数/析构函数
      

  7.   

    我的本意是想在JSP中让一个SESSION共享一个连接,从而不必每次使用都要打开连接,像这样
    <jsp:useBean id="x" scope="session" class="X"/>
    <%
      x.execute(...);    // x.close(); // 可我不能在这里close啊,否则设置scope为session就没有什么意义了,而且每次都要在execute前加上connect()或open()
    %>是不是这种情况下,创建x对象及最后关闭连接都只有在jspInit和jspDestroy中来写才行呢?
      

  8.   

    使用DataSource,不要尝试手工做这样的优化,效果往往适得其反,而且,您还没有分清scope之间的区别首先,为什么是放session?一个用户一个session,1000个人访问之后,你准备保留1000个开着的连接?(准确的说是一个IE进程,所以光一个人就可以叫你崩溃)其次,jspInit和destory和session就更没有关系了
      

  9.   

    如果scope是page, 是不是意味着进入每一个页面,都需要重新创建对象和并且创建数据库连接一次?这样是不是效率很低?如果有1000个人同时访问某页面,那么应用服务器(比如tomcat等等)或者FTP服务器也得同时处理1000个连接并保持Session, 假如能抵得住的话,那么同样对于数据库服务器,同样数量的活动连接会很崩溃吗?
      

  10.   

    我没有叫你放page,而且保持1000个session和保持1000个打开的连接是两码事,而且,使用了连接池之后,即使达到1000个同时访问,(通常配置情况下)也不尝试建立1000个连接,而是使用现有最大连接,让其他处理排队等