【问题标题】:Closing InitialContext vs initialising it to null关闭 InitialContext 与将其初始化为 null
【发布时间】:2018-01-10 19:59:47
【问题描述】:

有点困惑 - 假设我们像这样创建 InitialContextDataSource

InitialContext ctx = new InitialContext();
DataSource ds = ((DataSource) ctx.lookup("jdbc/hsqldb"));

现在在做一些数据库操作的时候,建议关闭ctx

 if (ctx != null) {
     ctx.close();
    }

但是here InitialContext 被简单地初始化为null:

import java.sql.*;
import javax.sql.*;
import javax.ejb.*;
import javax.naming.*;

public class DistributedTransactionBean implements SessionBean {

    // ...

    public void ejbCreate() throws CreateException {

        ctx = new InitialContext();
        ds = (DataSource)ctx.lookup("jdbc/distCoffeesDB");
    }

    public void updateTotal(int incr, String cofName, String username,
                            String password)
        throws SQLException {

        Connection con;
        PreparedStatement pstmt;

        try {
            con = ds.getConnection(username, password);
            pstmt = con.prepareStatement("UPDATE COFFEES " +
                        "SET TOTAL = TOTAL + ? " +
                        "WHERE COF_NAME = ?");
            pstmt.setInt(1, incr);
            pstmt.setString(2, cofName);
            pstmt.executeUpdate();
            stmt.close();
        } finally {
            if (con != null) con.close();
        }
    }

    private DataSource ds = null;
    private Context ctx = null;
}

那么当ctx 被初始化为null 而不关闭它时会发生什么?

【问题讨论】:

  • 一个询问“哪种方式更好”的问题通常注定会因为主要基于意见而被关闭。不过,这有一个正确的答案:当你准备好使用资源时,总是关闭它们。顺便说一句,关闭资源和清空变量是两个不同的不可比较的事情。
  • 好的,问题改了。

标签: java database initial-context


【解决方案1】:

你认为“ctx 设置为空”是什么时候?

从您提供的代码看来,ctx 不是“设置为 null”,而是初始化为 null。

然后(在初始化之后)在创建 bean 期间,调用 ejbCreate() 并分配对 InitialContext 的引用:

ctx = new InitialContext();

【讨论】:

  • 所以 Sun/Oracle 页面告诉将其初始化为 null,而不是关闭它。仍然,无法弄清楚区别..
  • 请熟悉初始化的工作原理。例如:java class member initialisation
  • 所以如果 Sun/Oracle 这里建议初始化为 null 可关闭资源,那么这意味着我们可以初始化为 null 而不是关闭例如 InputStream、OutputStream、数据库连接等。我认为这不好。我的问题仍未得到解答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多