私は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
プロパティtestOnBorrow
をtrue
に設定する必要があることがわかりました。これは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>