2012-09-11 42 views
0

的應用程序,我配置了CloudBees的運行@雲實例運行正常,但過了一段不活動後它就會被取消激活,然後似乎連接池是不正確刷新。恢復從睡眠導致「通信鏈路故障」

當我回到網站,最初的幾個請求超時有:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 4,746,680 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. 
    sun.reflect.GeneratedConstructorAccessor86.newInstance(Unknown Source) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 
    com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
    com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3092) 
    com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2978) 
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3526) 
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989) 
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150) 
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) 
    com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5022) 
    org.apache.tomcat.dbcp.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371) 
    org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328) 
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:87) 
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473) 

我使用的CloudBees的-web.xml文件中配置這樣的數據源通過JNDI連接:

<resource name="jdbc/myapp" auth="Container" type="javax.sql.DataSource"> 
     <param name="username" value="myuser" /> 
     <param name="password" value="mypass" /> 
     <param name="url" value="jdbc:cloudbees://myurl /> 
    </resource> 

有一些配置我失蹤,或者這是與服務器的連接池配置中的錯誤?

回答

4

[從Database Guide上的CloudBees維基]

MySQL包含一個超時,將關閉已空閒的長時間的連接。爲了提高數據庫性能,CloudBees DataSources使用Apache DBCP連接池在應用程序關閉後重用JDBC連接。

如果您使用的是已在池中閒置太久的連接,您的應用程序可能會遇到以下錯誤:「從服務器成功接收最後一個包是XXX秒前」。

連接池包括:設置調用javax.sql.DataSource.getConnection()時,該會驗證並拋出死連接。要使用此設置,請將以下XML參數添加到cloudbees-web.xml中的DataSource定義中。

<param name="validationQuery" value="SELECT 1" /> 
<param name="testOnBorrow" value="true" /> 

因此,對於你的資源,你應該能夠做到以下幾點:

<resource name="jdbc/myapp" auth="Container" type="javax.sql.DataSource"> 
    <param name="username" value="myuser" /> 
    <param name="password" value="mypass" /> 
    <param name="url" value="jdbc:cloudbees://myurl /> 
    <param name="validationQuery" value="SELECT 1" /> 
    <param name="testOnBorrow" value="true" /> 
</resource> 

如果您使用的是蜜蜂的應用程序:bind命令,而不是CloudBees的-web.xml中注入你的數據源,您可以使用這些參數作爲命令的參數

bees app:bind -a APP_ID -db DB_NAME -as JNDI_ALIAS validationQuery="SELECT 1" testOnBorrow=true 
+0

請注意,testOnBorrow將導致SELECT 1在每次從池中獲取連接時執行,例如實際上針對每個執行的查詢。使用minEvictableIdleTimeMillis,timeBetweenEvictionRunsMillis和numTestsPerEviction這裏http://juststuffreally.blogspot.de/2007/10/broken-pipes-with-tomcat-and-dbcp.html描述的某些超時後驅逐連接可能是DBCP池一個更好的主意。或者,你可以嘗試testWhileIdle而不是testOnBorrow。 –

相關問題