11

私はHibernateとDBCPを使用してmySQL接続を管理しています。これらはすべてSpringプロジェクトで行われます。

すべてが正常に機能しています。唯一の問題は、アプリが長時間静止していると、接続が切断されているために例外がスローされることです(アプリケーションが起動しているときにmySQLdを再起動した場合も同じです)。ユーザーが例外ページ(またはカスタムページ)を取得し、リロードすると問題が解決するため、大したことではありません。しかし、私はそれを解決したいと思います。例外の一部は次のとおりです。

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

**ネストされた例外を開始します**

java.io.EOFExceptionメッセージ:サーバーからの応答を読み取ることができません。4バイトを読み取ることが期待され、接続が予期せず失われる前に0バイトを読み取ります。

スタックトレース:

java.io.EOFException:サーバーからの応答を読み取ることができません。4バイトを読み取ることが期待され、接続が予期せず失われる前に0バイトを読み取ります。

グーグルで調べたところ、mysqlを使用してdbcp.BasicDataSourceプロパティtestOnBorrowtrueに設定する必要があることがわかりました。これはservlet-context.xmlで行いました。

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://${mySQL.host}/${mySQL.db}" />
    <property name="username" value="${mySQL.user}" />
    <property name="password" value="${mySQL.pass}" />
    <property name="testOnBorrow" value="true"></property>
</bean>

しかし、問題は解決しません。手がかりはありますか?

解決!私が使用した:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://${mySQL.host}/${mySQL.db}" />
    <property name="username" value="${mySQL.user}" />
    <property name="password" value="${mySQL.pass}" />
    <property name="testOnBorrow" value="true"></property>
    <property name="validationQuery" value="SELECT 1"></property>
</bean>
4

1 に答える 1

12

設定する場合は、 -testOnBorrowも設定する必要がありますvalidationQuery

validateQuery-呼び出し元に返す前に、このプールからの接続を検証するために使用されるSQLクエリ。指定する場合、このクエリは少なくとも1つの行を返すSQLSELECTステートメントである必要があります。

timeBetweenEvictionRunsMillisまた、デッドコネクションがプールから削除されるように設定しました。

于 2011-04-12T17:32:09.630 に答える