3

我正在尝试将BoneCP作为 DBCP 的连接池替代方案。我将其添加bonecp-0.8.0rc-1.jar到我的运行时类路径中,并将代码从他们的示例页面复制粘贴到我的测试驱动程序中:

Connection connection = null;
BoneCP connectionPool;
try {
    Class.forName(config.getDatabaseLogger().getJDBCDriver());

    BoneCPConfig boneConfig = configureBoneCP(config);

    connectionPool = new BoneCP(boneConfig);

    connection = connectionPool.getConnection();    // fetch a connection
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

在上面写着:

connectionPool = new BoneCP(boneConfig);

Eclipse (Juno) 给了我一个编译器警告:

资源泄漏:“connectionPool”永远不会关闭

然后它给了我一个“将@SuppressWarnings 'resource' 添加到newConnectionManager ”的选项(newConnectionManager()引用包含在其中的类)。

这怎么可能?!?!Eclipse 如何知道BoneCP对象的任何信息,以及它如何知道它必须被关闭?这是 BoneCP 库附带的某种“自定义警告”吗?如果是这样,我如何向自己的项目添加/注释代码以帮助警告下游开发人员他们没有正确使用我的库?提前致谢!

4

2 回答 2

1
How does Eclipse know anything about a BoneCP object, 
                                  and how does it know that it must be closed?

日食文档说

实现接口 java.io.Closeable(自 JDK 1.5 起)和 java.lang.AutoCloseable(自 JDK 1.7 起)的类被认为代表外部资源,当不再需要它们时,应使用方法 close() 将其关闭。

Eclipse Java 编译器能够分析使用此类类型的代码是否符合此策略。

对象不直接代表操作系统资源。如果包装的资源已关闭,则包装器不需要关闭。相反,如果包装器被关闭,这将包括被包装资源的关闭。该分析具有用于检测包装器资源的第二个白名单,并将识别底层实际资源是否将通过包装器直接或间接关闭。任何一种都足以消除有关资源泄漏的警告。白名单包含来自 java.io、java.util.zip、java.security、java.beans 和 java.sound.sampled 的类。

您的 BoneCP 类实现了接口java.io.Serializable,这可能是原因。

于 2013-07-13T14:42:51.527 回答
1

警告是由以下语句引起的:

connection = connectionPool.getConnection();

该方法getConnection()返回一个java.sql.Connection类型的对象,该对象自 Java 7 起实现了java.lang.AutoCloseable。当 Eclipse 无法确定一个资源是否实现java.io.Closeable或被java.lang.AutoCloseable所有可能的代码路径关闭时,它会生成此警告。

于 2013-07-13T16:34:58.500 回答