2017-10-13 3 views
0

In meiner Wicket Anwendung zugreifen habe ich diese Serviceklasse:Wicket - Rohrbruch Ausnahme erhalten, wenn 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) {} 
} 

Diese Dienstklasse in einen Wicket-Panel "injiziert" wird:

public class MyPanel extends Panel { 

    @SpringBean() 
    private DatabaseService service; 

} 

Es funktioniert fein. Aber wenn ich die Anwendung Stunden später öffnen (Server noch läuft), erhalte ich folgende Fehlermeldung:

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) 

Ist es im Zusammenhang mit der (un) Mechaniken von Wicket lösen?

+0

Ist mögliches Szenario: DB mehr Abfrage ausgeführt wird, Wicket Komponente existiert nicht mehr (Seite reloodiert)? Wie lange ist das JNDI-Timeout definiert? –

+0

Eine wilde Vermutung, aber: stürzt Ihre Abfrage Mysql nicht ab? –

+0

Wenn ich F5 drücke, wird die Seite korrekt neu geladen. Ich habe vergessen zu erwähnen, dass ich Wicket Security/Authentification verwende. Vielleicht ist die Sitzung nicht mehr gültig, was den SQL-Absturz verursacht ... –

Antwort

0

MySQL-Verbindungen in der Regel nach einer gewissen Zeit aus. Dies führt zu Ausnahmen, wenn Sie einen Datenquellen-/Verbindungspool verwenden und keine Verbindungsvalidierung verwenden. Von der Stack-Trace Sie haben klebte ich sehe, dass Sie Apache dbcp als Datenquelle verwenden, so denke ich, Sie die folgenden Parameter auf sie setzen sollten:

validationQuery, testOnCreate, testOnBorrow, testOnReturn, testWhileIdle 
Verwandte Themen