2017-10-13 71 views
0

當在我的檢票應用程序,我有這樣的服務類:檢票 - 獲得破管的異常訪問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) {} 
} 

這個服務類是「注入」到檢票口面板:

public class MyPanel extends Panel { 

    @SpringBean() 
    private DatabaseService service; 

} 

它的工作原理精細。但是,如果我打開應用程序小時後(服務器仍在運行),我收到以下錯誤:

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) 

是否與(聯合國)連接分離檢票mechanismn?

+0

是可能的場景:DB正在執行長查詢,檢票組件不再存在(頁面重新編碼)?定義了多長時間的JNDI超時? –

+0

一個瘋狂的猜測,但:你的查詢不會崩潰Mysql? –

+0

如果我按下F5,則側面正確地重新加載。我忘記提及我使用Wicket Security/Authentification。也許會話不再有效,導致SQL崩潰... –

回答

0

MySQL連接在一段時間後通常會超時。如果您使用數據源/連接池並且不使用連接驗證,則會導致異常。從堆棧跟蹤你貼上我看你使用的是Apache DBCP作爲數據源,所以我想你應該在其上設置以下參數:

validationQuery, testOnCreate, testOnBorrow, testOnReturn, testWhileIdle