2011-10-18 13 views
15

Ho effettuato con successo una connessione a un server MySQL remoto tramite Glassfish, tuttavia ogni volta che apporto una modifica al codice o ai file XHTML, devo aprire il pannello di amministrazione di Glassfish e svuotare il pool di connessione, altrimenti ottengo il seguente errore quando ho appena aggiornare la pagina. Qualcuno ha provato questo? Posso pubblicare codice o altre informazioni se necessario.Perché è necessario svuotare il pool di connessione ogni volta che si esegue nuovamente la distribuzione?

stato HTTP 500 -

rapporto Tipo di eccezione

messaggio

server di descrizioneIl rilevato un errore interno() che impediva da soddisfare questa richiesta.

eccezione

javax.servlet.ServletException: WELD-000049 Impossibile richiamare [metodo] @PostConstruct pubblico com.myapp.QuestionController.initialize() su [email protected]

delle cause

org.jboss.weld.exceptions.WeldException: WELD-000049 Impossibile richiamare [metodo] @PostConstruct pubblico com.myapp.interfaces.QuestionController.initialize() su [email protected]

cause

java.lang.reflect.InvocationTargetException

cause

javax.ejb.EJBException

cause

javax.persistence.PersistenceException: Eccezione [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Interno Eccezione: java.sql.SQLException: errore nell'assegnazione di una connessione. Causa: java.lang.RuntimeException: Got un'eccezione durante XAResource.start: Codice di errore: 0

delle cause

Eccezione [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Interno Eccezione: java.sql.SQLException: errore nell'assegnazione di una connessione. Causa: Si eccezione durante XAResource.start:: java.lang.RuntimeException Codice errore: 0

cause

java.sql.SQLException: Errore nell'assegnazione una connessione. Causa: java.lang.RuntimeException: ha ottenuto un'eccezione durante XAResource.inizio:

cause

javax.resource.spi.ResourceAllocationException: Errore nell'assegnazione una connessione . Causa: Si eccezione durante XAResource.start:: java.lang.RuntimeException

cause

com.sun.appserv.connectors.internal.api.PoolingException: Si eccezione durante: java.lang.RuntimeException XAResource.start:

cause

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: Si eccezione durante XAResource.start:

012.

cause

java.lang.RuntimeException: Si eccezione durante XAResource.start:

cause

javax.transaction.xa.XAException: com.sun.appserv.connectors.internal. api.PoolingException: javax.resource.spi.LocalTransactionException: Link Communications fallimento

l'ultimo pacchetto ricevuto correttamente dal server era 435.409 milliseco nds fa. L'ultimo pacchetto inviato con successo al server era 7 millisecondi fa.

Image of config

persistenza XML

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SertifikatPU" transaction-type="JTA"> 
     <jta-data-source>jdbc/sertifikatdb</jta-data-source> 
    </persistence-unit> 
</persistence> 

In "Ulteriori oggetti" nelle impostazioni del pool di connessioni Glassfish ho appena configurato: nomeserver, URL, utente e password.


HO risolto questo problema

enter image description here

Ho fatto il mio doppio tavolo, simile a quello in Oracle.

CREATE TABLE dual 
(
    x VARCHAR(1) 
); 

INSERT INTO dual(x) VALUES('y'); 
+0

non transazionale Connessioni, isolamento delle transazioni :, livello di isolamento: -> Essi sono raggruppati in transazioni, qualcuno di loro? – LuckyLuke

+0

Come stai ottenendo la connessione? Ciò potrebbe causare questa eccezione. Inoltre, qual è la configurazione del pool di connessione. – r0ast3d

+0

C'è un riferimento alla connessione che si tiene da qualche parte? Potresti aggiungere ulteriori informazioni ... Anche sul server remoto, qual è la configurazione per il numero di client e connessioni? – r0ast3d

risposta

20

vostra causa principale, PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure è legato alla this Glassfish bug, che spiega (nella scheda commenti in basso) che potrebbe essere necessario aggiornare i collegamenti non validi.

Il commento del bug di Jagadish dice di verificare il tipo di convalida della connessione. Se è impostato su "autocommit" (impostazione predefinita), i driver JDBC possono memorizzare nella cache i dati di convalida della connessione precedenti e durante le future convalide della connessione non si verificherà alcuna interazione effettiva del database.

Per risolvere il problema, impostare connection-validation-method="table" e validation-table-name="any_table_you_know_exists" (sostituire any_table_you_know_exists con il nome di qualsiasi tabella esistente). Ciò costringe le connessioni a parlare al database invece che alla cache; se la connessione non è valida, verrà eliminata e ricreata. Potrebbe essere necessario specificare anche is-connection-validation-required="true".

articoli per aiutare con configurazioni aggiuntive:

  1. This article spiega anche il problema in dettaglio.
  2. Jagadish's Oracle Blog Article su questo argomento ha più informazioni.
  3. Article spiegazione della convalida della connessione JDBC Glassfish in dettaglio.

testo dal blog di Jagadish:

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required=true 
domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required = true 

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method=table 
domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method = table 

bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name=sys.systables 
domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name = sys.systables 

Si noti che il codice di esempio si riferisce a sys.systables, che è una tabella di MS SQL che è garantito per esistere. Per Oracle, fare riferimento alla tabella garantita dual. Per MySQL, creare una tabella a 1 colonna esclusivamente a scopo di validazione; mettilo al sicuro e prepopola la tabella inserendo una riga di dati.

+0

Grazie per la risposta. Sono nuovo di così, quindi ho bisogno di un piccolo aiuto su dove configurarlo. Sono andato a localhost: 4848 -> pool di connessioni JDBC -> seleziona la mia connessione -> quindi la scheda avanzata. Ho trovato il metodo di convalida della connessione di cui stavi parlando e ho anche selezionato la convalida della connessione richiesta. Ma non vedo il nome della tabella di convalida. – LuckyLuke

+0

Inoltre, vedere [questo articolo] (http://blogs.oracle.com/JagadishPrasath/entry/connection_validation_in_glassfish_jdbc) APPENA POSSIBILE. Apparentemente "è anche scritto dallo stesso Jagadish che ho menzionato prima (il suo blog!) E suggerisce di usare' fail-all-connections' per aggiornare in caso di fallimento. [Here] (http://alexandru-ersenie.com/2011/03/01/glassfish-jdbc-connection-validation-explained/) è un secondo articolo che spiega dettagliatamente la validazione della connessione JDBC glassfish. Entrambe sono letture eccellenti! – JoshDM

+0

Nel tuo dominio.xml, che aspetto ha il codice xml del pool di connessioni? Credo che sia qui che imposti le proprietà che ho suggerito. – JoshDM

1

Se si utilizza questo driver?

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

Vedo che si sta utilizzando un driver diverso dall'immagine allegata ...

Problemi correlati