0

正常に実行されるCloudBeesRun@ cloudインスタンスを構成しましたが、しばらく非アクティブになると非アクティブ化され、接続プールが適切に更新されていないようです。

サイトに戻ると、最初のいくつかのリクエストは次のようにタイムアウトします。

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

1 に答える 1

4

[ CloudBees Wikiのデータベースガイドより]

MySQL には、長時間アイドル状態だった接続を閉じるタイムアウトが含まれています。データベースのパフォーマンスを向上させるために、CloudBees DataSource は 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>

cloudbees-web.xml の代わりに bees app:bind コマンドを使用してデータソースを挿入する場合、これらのパラメーターをコマンドの引数として使用できます。

bees app:bind -a APP_ID -db DB_NAME -as JNDI_ALIAS validationQuery="SELECT 1" testOnBorrow=true
于 2012-09-11T14:56:56.383 に答える