资源在@Singleton @Predestroy方法

时间:2015-12-21 15:44:39

标签: java glassfish ejb-3.1

似乎资源不适用于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”。请注意,在@PostConstruct方法中,getConnection()调用成功。

它是应用服务器实现中的Bug吗?如果没有,删除临时表的最优雅方法是什么?

(使用Glassfish 4.1.1 + Derby DB。 使用与EAR一起部署的glassfish-resources.xml创建数据源

<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 个答案:

答案 0 :(得分:1)

由于这是@Singleton,因此@PreDestroy可能仅在上下文关闭时调用,因此dataSource可能已经destroyed/finalized/closed(不能具体)因为我不知道datasource的类型因此错误。