package com.foxconn.dbmanage;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/**
 * @author cucu
 * @version $Id$
 */
public class Test {
    private static Log log = LogFactory.getLog(Test.class);
    private DbManage db = DbManage.getInstance();    public void getData() {        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        StringBuffer buf = new StringBuffer();
        buf.append("select name from classes where name = ? ");
        String sql = buf.toString();
        try {
            con = db.getConnection();
            ps = con.prepareStatement(sql);
            ps.setString(1, "xiaxin");
            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println("name is" + rs.getString(1));
            }        } catch (SQLException se) {
            log.error(se, se);
        } finally {
            db.freeConnection(con, null, ps, rs);            if (con != null) {
                System.out.println("con is not be closed");
                System.out.println("con is " + con);            } else {
                System.out.println("con is  be closed");
            }
        }
    }
}问题如下:我在finally里面把connection用db.freeConnection给关掉了,然后 if (con != null)打印出con is not be closed;但是紧接着下面打印出con is null???con!=null怎么又是null呢?前后矛盾啊!!!哭!!!找了好久没有找出问题关键!!劳请大侠们帮忙!!!

解决方案 »

  1.   

    也就是说我在Test.java里面有一个finally,在finally里面他执行了if (con != null)里面的System.out.println这就证明con!=null,但是打印出了con is not be closed,却又打印出了con is null。这不是前后矛盾吗?不知道我说清楚了没有,没有说清楚请再跟贴!
      

  2.   

    你用debug跟踪一下,代码不是很多,因该很快会找到原因的,不过我从代码上看不出哪里有错。
      

  3.   

    看看log.error(se, se);里面都写了写什么?
      

  4.   

    if (conn != null) {                    //1
                try {
                    conn.close();
                    conn = null;                //2
                } catch (SQLException e) {
                    log.error("释放资源出错!", e);
                }
            }
    1.判断conn是否关闭不应该判断是否为null,而是判断conn.isClosed()
    2.这里的conn = null,对你Test类中的conn是没有影响的,搞清楚参数传递原则再写
    另外,自己写的那些获取conn和关闭conn的方法有些画蛇添足了....statement的关闭会自动关闭关联的rs,conn关闭会关闭关联的statement
      

  5.   

    To  fdabobi(小爪尖尖) 越说越糊涂了,你说这传进来的Connection是传值还是传引用呢?如果说是传值,那即使在DbManage.java 里close了也无所谓啊,在Test里还是可以用哦。如果是传引用的话,很明显如果con = null了那在Test.java里面的con也应该为null了,我觉得你的解释似乎没有多大道理。
      

  6.   

    System.out.println("con is " + con);有可能调用的是
    System.out.println("con is " + con.toString());
    不知道JAVA它这里的toString()方法的逻辑是什么。
    要们就是这样System.out.println("con is " + (con==null?"null":"not null"));
      

  7.   

    理论上来说你在Test.java里面的conn确实是!=null的。
    因为你在freeConnection里面置null只是把引用置为null,在Test.java里面的conn的引用仍然存在。但为什么打印出来的conn会是null?倒还真是奇怪。
    请看这个例子:
    public class Hello {
      public static void main(String[] args){
        Abc a = Abc.getInstance();
    Def b = a.getDef();
    a.setNull(b);
    if (b != null) {
    System.out.println("b is not be closed");
    System.out.println("b is " + b); } else {
    System.out.println("b is  be closed");
    }  }
    } class Abc{
    private static Abc pInstance = new Abc();
    public static Abc getInstance(){
    return pInstance;
    }
    public Def getDef(){
    return new Def();
    }
    public void setNull(Def a){
    a = null;
    }
    }
    class Def{
    }