2013-07-13 3 views
3

Я экспериментирую с BoneCP как альтернативу объединения соединений с DBCP. Я добавил bonecp-0.8.0rc-1.jar к моему выполнения классам и копирования-н-вставить код из их пример страницы в мой тестовый драйвер:Как создать настраиваемое предупреждение компилятора в Eclipse?

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); 

Затмение (Juno) дает мне предупреждение компилятора:

утечки ресурсов: 'connectionPool' это никогда не закрывается

Затем он дает мне опцию «Добавить ресурс @SuppressWarnings 'в newConnectionManager» (newConnectionManager() ссылается на класс, который содержится в нем).

Как это возможно?!?! Как Eclipse знает что-нибудь о объекте BoneCP и как он знает, что он должен быть закрыт? Это какое-то «пользовательское предупреждение», которое поставляется с библиотекой BoneCP? Если да, то каким образом я могу добавить/аннотировать код в свои собственные проекты, чтобы помочь разработчикам нижестоящих программ, чтобы они неправильно использовали мои библиотеки? Заранее спасибо!

+0

У вас есть Javadoc для BoneCp? – NINCOMPOOP

+0

Я сделал то же самое, но я не могу воспроизвести его. – johnchen902

ответ

1

предупреждение вызвана этим утверждением:

connection = connectionPool.getConnection(); 

Метод getConnection() возвращает объект типа java.sql.Connection, который реализует java.lang.AutoCloseable, поскольку Java 7. Eclipse, создает это предупреждение, когда он не может определить, является ли ресурс, который реализует либо java.io.Closeable или java.lang.AutoCloseable закрывается всеми возможными кодами.

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

Docs of eclipse says

Классы, реализующие интерфейс java.io.Closeable (так как JDK 1.5) и java.lang.AutoCloseable (с JDK 1.7) рассматриваются для представления внешних ресурсов, которые должны закрываться с помощью метода close(), когда они больше не нужны.

Компилятор Java Eclipse способен анализировать, придерживается ли этот код, используя такие типы.

объекты не представляют собой ресурс операционной системы. Если обернутый ресурс закрыт, оболочка не нуждается в закрытии. И наоборот, если оболочка закрыта, это включает закрытие обернутого ресурса. Анализ имеет второй белый список для обнаружения ресурсов оболочки и будет определять, будет ли основной фактический ресурс закрываться прямо или косвенно через обертку. Либо один достаточно, чтобы отключить предупреждения о утечке ресурсов. Белый список содержит классы из java.io, java.util.zip, java.security, java.beans и java.sound.sampled.

Ваш BoneCP Classe реализует интерфейс java.io.Serializable, это может быть причиной.

+1

[BoneCP] (http://jolbox.com/bonecp/downloads/site/apidocs/com/jolbox/bonecp/BoneCP.html) не реализовал эти интерфейсы. – johnchen902

+0

Но [BoneCP] (http://jolbox.com/bonecp/downloads/site/apidocs/index.html) не реализует ни один из них? – NINCOMPOOP

+0

как насчет интерфейса 'Connection'? У него есть метод close() .. как насчет этого ??? –