Mysqデータベース8時間アイドル後の接続タイムアウトの解決方法


MySqlデータベースが8時間を超えてアイドル状態になると、自動的に接続が切断され、接続タイムアウトエラーが表示されます.エラーコードは以下の通りです.
java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)

 
hibernateが所有する接続プールを使用すると、この問題が発生しやすく、インターネットで大量の資料を閲覧し、この問題を解決するいくつかの方法をまとめました.
(1)mysqlのmyを修正する.iniファイル、次の構成を追加します.
[mysqld]
# The TCP/IP Port the MySQL Server will listen onport=3306
# added from now
socket =/tmp/mysql.sock
#単位は秒で、24時間に相当し、デフォルトは28800で8時間wait_timeout=86400interactive_timeout = 86400
# added end
(2)proxool接続プールの方法を変更する:
proxoolを構成します.xmlファイルの内容は次のとおりです.
 
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
	<proxool>
		<!--      -->
		<alias>testDB</alias>
		<!--proxool            -->
		<driver-url>
			jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=GBK&amp;autoReconnect=true&amp;zeroDateTimeBehavior=convertToNull
		</driver-url>
		<!--JDBC    -->
		<driver-class>com.mysql.jdbc.Driver</driver-class>
		<driver-properties>
			<property name="user" value="root" />
			<property name="password" value="root" />
		</driver-properties>
		<!-- proxool               (  ),             ,     -->
		<house-keeping-sleep-time>900000</house-keeping-sleep-time>
		<house-keeping-test-sql>
			select CURRENT_DATE
		</house-keeping-test-sql>
		<!--                          ,                   -->
		<maximum-new-connections>20</maximum-new-connections>
		<!--           -->
		<prototype-count>5</prototype-count>
		<!--        ,       ,     ,        ,          maximum-new-connections  -->
		<maximum-connection-count>100</maximum-connection-count>
		<!--      -->
		<minimum-connection-count>10</minimum-connection-count>
	</proxool>
</something-else-entirely>
 

 
hibernateを設定します.cfg.xmlファイルの内容は次のとおりです.
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.provider_class">
			org.hibernate.connection.ProxoolConnectionProvider
		</property>
		<property name="hibernate.proxool.pool_alias">testDB</property>
		<property name="hibernate.proxool.xml">proxool.xml</property>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="show_sql">true</property>

		<mapping resource="tt/TT.hbm.xml" />	

	</session-factory>
</hibernate-configuration>

JAvaクラスの呼び出し方法は次のとおりです.
Class.forName("org.hibernate.connection.ProxoolConnectionProvider");
			Connection con = DriverManager.getConnection("proxool.testDB");

 
接続が終わったら、解放してください.
もちろん他にも接続プールの配置方法がありますが、方法はほぼ同じで、ここでは一つ一つ挙げません.