使用hibernate形成的MySql 8小時問題解決方案

本文借鑑了網上的不少博客,在此再也不聲明mysql


1.增長 MySQL 的 wait_timeout 屬性的值(不推薦)linux

mysql5以前的版本,能夠在jdbc鏈接的url中加入:autoReconnect = truesql

設置mysql5中wait_timeout
在linux中最大爲365,wait_timeout=31536000
在window中最大爲24天,以window爲例: 數據庫

這個方法並不推薦,緣由:服務器

MySQL服務器所支撐的最大鏈接數是有限的,由於每個鏈接、第一個表打開的操做都要消耗服務器內存,理想狀態是當一個MySQL客戶端鏈接完成工做就自動斷開釋放內存,若是你的你的網站有大量的MySQL連接請求,這些鏈接完成SQL執行任務後空閒着啥事也不幹,白白佔用內存資源,若是 這些鏈接堆積起來,將致使MySQL超過最大鏈接數,從而沒法新建MySQL鏈接,有可能致使「Too many connections」的錯誤。
參考自:http://blog.csdn.net/cenfei78325747/article/details/7854611
session


2.使用鏈接池(推薦)ide

(1)不管是使用C3PO仍是proxool鏈接池,必定要去hibernate解壓包裏找到相應文件夾的jar包,導入:
測試

有些人一直解決不了鏈接池問題,可能緣由就在這裏
以proxool爲例:
(2)配置hibernate.cfg.xml網站

<session-factory>
<!-- 選擇使用鏈接池 -->
<property name="connection.provider_class">
  org.hibernate.connection.ProxoolConnectionProvider
 </property>
<!-- 指明要使用的proxool.xml中定義的proxool別名 -->
<property name="proxool.pool_alias">mysql</property>
<!-- 指明Proxool配置文件所在位置,這裏與Hibernate的配置文件在同一目錄下 -->
<property name="proxool.xml">proxool.xml</property>

..............

</session-factory>

(3)在同一目錄下配置proxool.xmlurl

<?xml version="1.0" encoding="UTF-8"?>
<proxool>
<!-- proxool別名 -->
<alias>mysql</alias>
<!-- 數據庫鏈接Url -->
<driver-url>
<![CDATA[jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=UTF-8]]>
</driver-url>
<!-- JDBC驅動名稱 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 數據庫鏈接賬號 -->
<driver-properties>
<!--這裏改爲你本身的-->
<property name="user" value="root" />
<property name="password" value="password" />
</driver-properties>
<!-- proxool自動偵察各個鏈接狀態的時間間隔(毫秒),偵察到空閒的鏈接就立刻回收,超時的銷燬 -->
<house-keeping-sleep-time>60000</house-keeping-sleep-time>
<!-- 指因未有空閒鏈接能夠分配而在隊列中等候的最大請求數,超過這個請求數的用戶鏈接就不會被接受 -->
<maximum-new-connections>100</maximum-new-connections>
<!-- 最少保持的空閒鏈接數 -->
<prototype-count>3</prototype-count>
<!-- 容許最大鏈接數,超過了這個鏈接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new- connections決定 -->
<maximum-connection-count>20</maximum-connection-count>
<!-- 最小鏈接數 -->
<minimum-connection-count>3</minimum-connection-count>
<!-- 在分配鏈接先後是否進行有效性測試,這個是解決本問題的關鍵 -->
<test-before-use>true</test-before-use>
<test-after-use>true</test-after-use>
<!-- 用於測試的SQL語句 -->
<house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql>
</proxool>
</something-else-entirely>

參考:http://blog.csdn.net/u012377333/article/details/50600173

相關文章
相關標籤/搜索