我正在尝试使用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'资源添加到newConnectionManager ”的选项(newConnectionManager()
引用包含在其中的类)。
这怎么可能?!?! Eclipse如何知道BoneCP
对象的任何信息,以及它如何知道它必须关闭?这是与BoneCP库一起提供的某种“自定义警告”吗?如果是这样,我如何添加/注释代码到我自己的项目,以帮助警告下游开发人员他们没有正确使用我的库?提前谢谢!
答案 0 :(得分: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 classe实现了接口 java.io.Serializable ,这可能是原因。
答案 1 :(得分:1)
警告是由此声明引起的:
connection = connectionPool.getConnection();
方法getConnection()
返回类型为java.sql.Connection的对象,该对象自Java 7开始实现java.lang.AutoCloseable。当Eclipse无法确定是否实现{{1}的资源时,Eclipse会生成此警告或java.io.Closeable
被所有可能的代码路径关闭。