Mysqデータベース8時間アイドル後の接続タイムアウトの解決方法
MySqlデータベースが8時間を超えてアイドル状態になると、自動的に接続が切断され、接続タイムアウトエラーが表示されます.エラーコードは以下の通りです.
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ファイルの内容は次のとおりです.
hibernateを設定します.cfg.xmlファイルの内容は次のとおりです.
JAvaクラスの呼び出し方法は次のとおりです.
接続が終わったら、解放してください.
もちろん他にも接続プールの配置方法がありますが、方法はほぼ同じで、ここでは一つ一つ挙げません.
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&characterEncoding=GBK&autoReconnect=true&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");
接続が終わったら、解放してください.
もちろん他にも接続プールの配置方法がありますが、方法はほぼ同じで、ここでは一つ一つ挙げません.