2015-12-21 32 views
6

似乎資源不適用於Singleton的@Predestroy方法。@Singleton中的資源不可用@Predestroy方法

@PreDestroy 
public void cleanup() { 
    logger.info("*** Application shutting down. Dropping temporary tables ***"); 
    try { 
     connection = dataSource.getConnection(); 

     Statement statement = connection.createStatement(); 
     statement.execute("drop table TABLE1"); 
     statement.execute("drop table TABLE2"); 
     connection.close(); 
     connection = null; 
    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 
    } 
} 

對getConnection()的調用失敗,並顯示錯誤「No Pool Meta Data object associated with the pool」。請注意,getConnection()調用在@PostConstruct方法中是成功的。

這是應用程序服務器實現中的一個錯誤嗎?如果沒有,刪除臨時表的最優雅方式是什麼?

(使用的是GlassFish 4.1.1 +德比DB 數據源是使用與GlassFish resources.xml中部署了EAR

<resources> 
    <jdbc-resource pool-name="EmbeddedDerbyPool" 
        jndi-name="java:app/jdbc/ActionBazaarDS" /> 
    <jdbc-connection-pool name="EmbeddedDerbyPool" 
          res-type="javax.sql.DataSource" 
          datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource" 
          is-isolation-level-guaranteed="false"> 
     <property name="databaseName" value="memory:action-bazaar-db"/> 
     <property name="createDatabase" value="create"/> 
    </jdbc-connection-pool> 
</resources> 

創建。)

更新:
我創建了一個GlassFish https://java.net/jira/browse/GLASSFISH-21476中的錯誤報告。

回答

1

由於這是一個@Singleton,該@PreDestroy據推測僅稱爲上下文停產,可能dataSource已經被destroyed/finalized/closed(不能具體這裏我不知道datasource類型),因此錯誤。