在java程序與數(shù)據(jù)庫(kù)連接的編程中普泡,mysql jdbc url格式如下:
jdbc:mysql://[host:port],[host:port].../[database][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...
如jdbc:mysql://localhost:3306/test?user=test&password=123456
剛好最近遇到一個(gè)數(shù)據(jù)庫(kù)連接參數(shù)帶來(lái)的問(wèn)題,所以羅列一下幾個(gè)較為重要的參數(shù):
user 數(shù)據(jù)庫(kù)用戶名(用于連接數(shù)據(jù)庫(kù)) 必要參數(shù)衣形。
password 用戶密碼(用于連接數(shù)據(jù)庫(kù)) 如果設(shè)置了密碼的話同樣為必要參數(shù)座柱。
useUnicode 是否使用Unicode字符集榴鼎,如果參數(shù)characterEncoding設(shè)置為utf-8或gbk口叙,本參數(shù)值需設(shè)置為true乡数,默認(rèn)為false椭蹄。
characterEncoding 允許用戶自己設(shè)定數(shù)據(jù)庫(kù)編碼,指定字符編碼净赴,在程序與數(shù)據(jù)庫(kù)交互時(shí)塑娇,如果數(shù)據(jù)的編碼類型與數(shù)據(jù)庫(kù)的編碼類型不一致時(shí),如程序中使用GBK劫侧,而數(shù)據(jù)庫(kù)的數(shù)據(jù)類型為utf8,會(huì)出現(xiàn)傳參無(wú)法識(shí)別導(dǎo)致無(wú)法得到預(yù)期的數(shù)據(jù)返回的問(wèn)題。為了解決此問(wèn)題烧栋,我們需要在URL上設(shè)置characterEncoding=utf8写妥。
示例代碼:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
autoReconnect 當(dāng)數(shù)據(jù)庫(kù)連接異常中斷時(shí),是否自動(dòng)重新連接审姓, 默認(rèn)值為false珍特。
autoReconnectForPools 是否使用針對(duì)數(shù)據(jù)庫(kù)連接池的重連策略, 默認(rèn)值為false魔吐。
以上兩個(gè)參數(shù)都是設(shè)置是否允許連接斷開(kāi)后自動(dòng)重連扎筒,jdbc中mysql的連接在長(zhǎng)時(shí)間的連接后,可能會(huì)出現(xiàn)斷連或者出現(xiàn)數(shù)據(jù)庫(kù)突然宕機(jī)的狀況酬姆。重啟數(shù)據(jù)庫(kù)服務(wù)可能也會(huì)繼續(xù)報(bào)異常嗜桌,只有重啟應(yīng)用重新連接才可以避免繼續(xù)報(bào)錯(cuò),為了解決這種問(wèn)題辞色,一般會(huì)設(shè)置此參數(shù)骨宠,這時(shí)可以使用這個(gè)參數(shù)來(lái)要求jdbc 驅(qū)動(dòng)在發(fā)現(xiàn)數(shù)據(jù)庫(kù)連接異常后會(huì)自動(dòng)地重新連接。在使用數(shù)據(jù)連接池的情況相满,如使用DBCP或者c3p0連接池层亿,應(yīng)盡量使用autoReconnectForPools。
connectTimeout 和數(shù)據(jù)庫(kù)服務(wù)器建立socket連接時(shí)的超時(shí)立美,單位:毫秒匿又, 0表示永不超時(shí)。
socketTimeout socket操作(讀寫)超時(shí)建蹄,單位:毫秒碌更, 0表示永不超時(shí) 。
JDBC使用socket與數(shù)據(jù)庫(kù)連接躲撰,數(shù)據(jù)庫(kù)并不對(duì)應(yīng)用與數(shù)據(jù)庫(kù)間的連接超時(shí)進(jìn)行處理,JDBC的socket timeout在數(shù)據(jù)庫(kù)被突然停掉或是發(fā)生網(wǎng)絡(luò)錯(cuò)誤(由于設(shè)備故障等原因)時(shí)十分重要针贬。由于TCP/IP的結(jié)構(gòu)原因,socket沒(méi)有辦法探測(cè)到網(wǎng)絡(luò)錯(cuò)誤拢蛋,因此應(yīng)用也無(wú)法主動(dòng)發(fā)現(xiàn)數(shù)據(jù)庫(kù)連接斷開(kāi)桦他。如果沒(méi)有設(shè)置socket timeout的話,應(yīng)用在數(shù)據(jù)庫(kù)返回結(jié)果前會(huì)無(wú)期限地等下去谆棱,這種連接被稱為dead connection快压。為了避免dead connections,socket必須要有超時(shí)配置垃瞧。socket timeout可以通過(guò)JDBC設(shè)置蔫劣,socket timeout能夠避免應(yīng)用在發(fā)生網(wǎng)絡(luò)錯(cuò)誤時(shí)產(chǎn)生無(wú)休止等待的情況,縮短服務(wù)失效的時(shí)間个从。
此參數(shù)為jdbc的過(guò)期時(shí)間設(shè)置脉幢,與mysql-server的過(guò)期時(shí)間不是同一參數(shù)歪沃。
? socket連接時(shí)的timeout:通過(guò)Socket.connect(SocketAddress endpoint, int timeout)設(shè)置
? socket讀寫時(shí)的timeout:通過(guò)Socket.setSoTimeout(int timeout)設(shè)置
示例代碼:
jdbc:mysql://localhost:3306/test?connectTimeout=60000&socketTimeout=60000
以上為整理的較為常用的參數(shù),如果感興趣可以去官網(wǎng)查閱一下其他參數(shù)嫌松,謝謝觀看沪曙。