2015-12-21 41 views
6

Wygląda na to, że zasoby nie są dostępne dla metody Singleton @Predestroy.Zasób niedostępny w @Singleton @Predestroy method

@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(); 
    } 
} 

Wezwanie do getConnection() kończy się błędem "No Pool Meta Data object associated with the pool". Zauważ, że wywołanie getConnection() zakończyło się powodzeniem w metodach @PostConstruct.

Czy to błąd w implementacji serwera aplikacji? Jeśli nie, jaki jest najbardziej elegancki sposób na opuszczenie tymczasowych stołów?

(przy użyciu przeźroczkom 4.1.1 + Derby DB Źródłem danych jest tworzona przeźroczkom-resources.xml rozmieszczone z 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> 

).

Update:
utworzonego raport o błędzie w GlassFish https://java.net/jira/browse/GLASSFISH-21476.

Odpowiedz

1

Ponieważ jest to @Singleton The @PreDestroy jest prawdopodobnie wywołana tylko przy zamykaniu kontekstowego, więc jest możliwe, że dataSource jest już destroyed/finalized/closed (nie może być specyficzny tutaj jak nie wiem typ datasource) zatem błąd .