java和mysql實現過期檢測的簡單介紹

本文目錄一覽:

java處理mysql日期問題

你還能用util.date的格式存進去么?是sql.date吧

所以在取出來的時候,使用sql.date接收就行了

如果需要改變格式的話,先轉換成字元串就好了

JAVA連mysql

查看了Mysql的文檔,以及Connector/J的文檔以及在線說明發現,出現這種異常的原因是:Mysql伺服器默認的「wait_timeout」是8小時,也就是說一個connection空閑超過8個小時,Mysql將自動斷開該 connection。這就是問題的所在,在C3P0 pools中的connections如果空閑超過8小時,Mysql將其斷開,而C3P0並不知道該connection已經失效,如果這時有 Client請求connection,C3P0將該失效的Connection提供給Client,將會造成上面的異常。

上網搜索,在MySQL的論壇上找到一個辦法,就是如果在執行sql語句的時候發生了上述異常,就將sql語句重新執行一次。

試驗發現,這個辦法對這個使用spring+hibernate的服務無效。

進一步搜索發現,MySQL官方不推薦使用autoReconnect=true,參見

需要另外找別的辦法來解決這個問題。

由於問題產生的根本原因在於服務到資料庫的連接長時間沒活動,既然重新連接的辦法無效,就可以嘗試另外一種辦法,就是反空閑。

自己寫一個線程來反空閑的話,比較麻煩。

最後在網上找到一個辦法。為hibernate配置連接池,推薦用c3p0,然後配置c3p0的反空閑設置idle_test_period,只要小於MySQL的wait timeout即可。

在hibernate.cfg.xml中增加下面幾項:

!– configuration pool via c3p0–

property name=”hibernate.connection.provider_class”org.hibernate.connection.C3P0ConnectionProvider/property

property name=”c3p0.min_size”5/property

property name=”c3p0.max_size”30/property

property name=”c3p0.time_out”1800/property !– seconds –!– default: 0 —

property name=”c3p0.max_statement”50/property !– default: 0 —

property name=”c3p0.acquire_increment”1/property !– default: 1 —

property name=”c3p0.idle_test_period”120/property !– seconds –!– default: 0 —

property name=”c3p0.validate”true/property

修改完後測試,問題解決。

——————————————————–

DBCP連接池說明:

driverClassName

url

username

password

上面四個分別是驅動,連接字元串,用戶名和密碼

maxActive 連接池支持的最大連接數

maxIdle 連接池中最多可空閑maxIdle個連接

minIdle 連接池中最少空閑maxIdle個連接

initialSize 初始化連接數目

maxWait 連接池中連接用完時,新的請求等待時間,毫秒

timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒檢查一次連接池中空閑的連接,把空閑時間超過minEvictableIdleTimeMillis毫秒的連接斷開,直到連接池中的連接數到minIdle為止

minEvictableIdleTimeMillis 連接池中連接可空閑的時間,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒沒有使用的活動連接,清理後並沒有放回連接池

removeAbandonedTimeout 活動連接的最大空閑時間

logAbandoned true,false,連接池收回空閑的活動連接時是否列印消息

minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個參數針對的連接對象不一樣,minEvictableIdleTimeMillis針對連接池中的連接對象,removeAbandonedTimeout針對未被close的活動連接.

c3p0連接池說明:

driverClass

jdbcUrl

user

password

minPoolSize

maxPoolSize

initialPoolSize

acquireIncrement 池中沒有空閑連接時,一次請求獲取的連接數

maxIdleTime 池中連接最大空閑時間

acquireRetryAttempts 獲取連接失敗後,重新嘗試的次數

acquireRetryDelay 嘗試連接間隔時間,毫秒

checkoutTimeout 等待連接時間,0為無限等待,毫秒

DebugUnreturnedConnectionStackTraces true,false,是否收回未返回的活動連接

unreturnedConnectionTimeout 活動連接的時間.

jdbcurl建議不要使用autoReconnect=true。

———————————————————————-

session.close();沒有調用connection.close()嗎?

如果你的Connection來自於連接池,他只不過被歸還給池了,確實沒有物理關閉,這是正常的結果。

若調用connection.close(), 此連接對象是關閉,還是沒有關閉,只返回給了連接池 ?

那要看連接池的實現了。一般都是返回給連接池,因為新建連接的開銷太大了。

創建一個SessionFactry就對應一個Connection,面SessionFactory中的Session是共享Connection .所以關閉Session對Connection沒有影響的.

資料庫連結池不過就是一個特殊的對象池而已。 對象池的作用就是避免你直接new資源性的對象,降低開銷。把連結返回給連結池就是釋放對該對象池中該Connection對象的引用,這樣,這個對象可以給再次被別人使用。 你調用conn.close(),僅僅是釋放了引用而已,不會關閉物理的連接。

connection對像在鏈接池中複寫了close方法,所以並沒有真正意義上的關閉。明白了吧。當然不同的鏈接池有不同的實現方法,connection只是一個介面,不同的鏈接池實現類是不一樣的,只是我們感覺不到罷了。

java連接mysql資料庫超時的問題誰遇到過?

推測你指的是mysql伺服器的超時吧。默認情況8小時無訪問mysql會斷開連接。通過改配置文件可以改變這個值,但是實際測試效果不好。

mysql方面不好解決就在client端想辦法,大多數鏈接池可以配置在取得鏈接時檢測可用性(據說c3p0連接池可以自動解決,我用的dbcp需要配置),比如ibatis可以在datasource配置加上property

name=”validationQuery”

value=”select

1

from

dual”/

property

name=”testOnBorrow”

value=”true”/

原創文章,作者:RAUT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134500.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RAUT的頭像RAUT
上一篇 2024-10-04 00:06
下一篇 2024-10-04 00:06

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29

發表回復

登錄後才能評論