2017-10-13 5 views
0

Dans mon application wicket j'ai cette classe de service:Wicket - Obtenir broken pipe exception lors de l'accès DB

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.transaction.annotation.Transactional; 

@Component 
@Transactional 
public class DatabaseService { 

    @Autowired 
    SessionFactory sessionFactory; 

    public void save(Message m) {} 
} 

Cette classe de service est "injecté" dans un panneau portillon incorporé:

public class MyPanel extends Panel { 

    @SpringBean() 
    private DatabaseService service; 

} 

Il fonctionne bien. Mais si je l'ouvre plus tard, les heures d'application (serveur est toujours en cours), je reçois l'erreur suivante:

java.net.SocketException: Datenübergabe unterbrochen (broken pipe) 
     at java.net.SocketOutputStream.socketWrite0(Native Method) 
     at java.net.SocketOutputStream.socketWrite(Unknown Source) 
     at java.net.SocketOutputStream.write(Unknown Source) 
     [...] 
     at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
     at java.io.BufferedOutputStream.flush(Unknown Source) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3634) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2460) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547) 
     at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4874) 
     at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371) 
     at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328) 
     [...] 
(JdbcResourceLocalTransactionCoordinatorImpl.java:214) 
     at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52) 
     at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1525) 
     at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:500) 
     [...] 
     at de.project.database.DatabaseService$$EnhancerBySpringCGLIB$$8fa0ab80.getMessages(<generated>) 
     at WICKET_de.project.database.DatabaseService$$FastClassByCGLIB$$68e55e7c.invoke(<generated>) 
     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
     at org.apache.wicket.proxy.LazyInitProxyFactory$AbstractCGLibInterceptor.intercept(LazyInitProxyFactory.java:350) 
     at WICKET_de.project.database.DatabaseService$$EnhancerByCGLIB$$a9cbdf2b.getMessages(<generated>) 
     at de.project.pms.MyPanel.<init>(MyPanel.java:26) 
     at de.project.home.projectHome.<init>(projectHome.java:17) 

est-il connecté à la (non) détacher mechanismn du guichet?

+0

Est scénario possible: DB est en train d'exécuter plus requête, le composant Wicket n'existe plus (page relaodée)? Combien de temps le délai JNDI est défini? –

+0

Une conjecture sauvage, mais: votre requête ne plante-t-elle pas Mysql? –

+0

Si j'appuie sur F5, le côté est rechargé correctement. J'ai oublié de mentionner que j'utilise Wicket Security/Authentification. Peut-être que la session n'est plus valide qui provoque le crash de SQL ... –

Répondre

0

Les connexions MySQL expirent généralement après un certain temps. Cela provoque des exceptions si vous utilisez un pool de sources de données/connexion et n'utilisez pas la validation de connexion. A partir de la trace de la pile que vous avez collé, je vois que vous utilisez dbcp apache comme source de données, donc je pense que vous devez définir les paramètres suivants sur elle:

validationQuery, testOnCreate, testOnBorrow, testOnReturn, testWhileIdle