最近有個用戶量 5W-10W 的 web 應(yīng)用,頻繁導(dǎo)致 weblogic 崩潰,讓運(yùn)維組很難受。
創(chuàng)新互聯(lián)公司是專業(yè)的長海網(wǎng)站建設(shè)公司,長海接單;提供網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行長海網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!通過幾天跟蹤系統(tǒng)日志和 weblogic 運(yùn)行狀況,發(fā)現(xiàn)報(bào)錯的姿勢有很多,其中對定位問題比較關(guān)鍵的報(bào)錯:
ExecuteThread: '496' for queue: 'weblogic.kernel.Default (self-tuning)' has beenbusy for "712" seconds working on the request "XXXX", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.
weblogic 分配給 web 應(yīng)用使用的線程響應(yīng)返回周期大為10分鐘,線程遲遲無法返回結(jié)果導(dǎo)致阻塞,并且這樣的刺頭線程越來越多。
運(yùn)行一段時間后達(dá)到 weblogic 阻塞線程的閥值,weblogic 自然就崩潰了。
剛開始也試著調(diào)大 weblogic 響應(yīng)周期/阻塞線程的閥值,但是阻塞線程還是會存在并且很快達(dá)到閥值。
仔細(xì)比對奔潰前后日志,查看 weblogic 阻塞線程詳情,導(dǎo)致阻塞開始罪魁禍?zhǔn)资菙?shù)據(jù)庫查詢需要很長時間。
該系統(tǒng)與內(nèi)外圍很多廠商系統(tǒng)有進(jìn)行數(shù)據(jù)交互,數(shù)據(jù)庫里面旁根錯雜的 db_link/synonyms/view/procedure。
而且是老舊項(xiàng)目,代碼經(jīng)過很多人修改,已經(jīng)風(fēng)燭殘年搖搖欲墜,俺想重造它不是一天兩天了,因?yàn)楹芏嘣驘o法進(jìn)行,很無奈。
規(guī)范數(shù)據(jù)庫中的交互流程?然后動代碼?oh,no! 限定解決的期限將至,不能拖。
所有最后將目光放到數(shù)據(jù)庫連接池這部分,也使我不得不重新審視這塊對于 web 項(xiàng)目的重要性。好了,言歸正傳。
回到頂部
DataSource:數(shù)據(jù)源是在 JDBC2.0 中引入的一個概念;
在 JDBC 擴(kuò)展包中定義了Java.sql.DataSource 接口,它負(fù)責(zé)建立與數(shù)據(jù)庫的連接;
在應(yīng)用程序訪問數(shù)據(jù)庫是不必編寫連接數(shù)據(jù)庫的代碼,可直接從數(shù)據(jù)源獲得數(shù)據(jù)庫連接。
ConnectionPool :在數(shù)據(jù)源中初始化建立了多個數(shù)據(jù)庫連接,這些數(shù)據(jù)庫連接保存在連接池(ConnectionPool)中。
Java程序訪問數(shù)據(jù)庫時,只需從連接池中取出空閑狀態(tài)的數(shù)據(jù)庫連接,當(dāng)訪問結(jié)束時,將數(shù)據(jù)庫連接返回給連接池。
JNDI : (Java Naming and Directory Interface)Java命名與目錄接口;
為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一的接口。
其實(shí)可以將 JNDI 理解為一種對象和名字綁定的技術(shù),即指定一個資源名稱,將該名稱與某一資源或服務(wù)相關(guān)聯(lián)。
結(jié)合圖和上面的簡述,數(shù)據(jù)層關(guān)鍵性對象都已展露無遺,同樣也很容易理解。
JNDI 避免了程序與數(shù)據(jù)庫之間的緊耦合,使應(yīng)用更加易于配置、易于部署。
回到頂部
weblogic 上配置 JNDI 為圖形界面,操作起來很方便,而且那是運(yùn)維組的事情,術(shù)業(yè)有專攻。
這里我拿 Tomcat 為例(開發(fā)時你也不可能在本機(jī)裝個 weblogic 調(diào)試吧),簡述下配置 JDNI 的幾種方式:
a. 全局使用:Tomcat 的 conf 文件夾下的 context.xml 配置文件中添加:
b.局部使用:Tomcat 的 conf 文件夾下 server.xml 的
Context path="/demo_jndi" docBase="/demo_jndi">
c.局部使用:應(yīng)用 META-INFO 下新建 context.xml 添加:
上述幾種配置使用的數(shù)據(jù)源都為 javax.sql.DataSource,當(dāng)然你也可以引入其他開源的數(shù)據(jù)源。
也就是 web 容器使用其他的開源數(shù)據(jù)庫連接池,比如像下面這集中姿勢(記得將依賴的 jar 添加到容器的 lib 中):
配置好之后,使用起來也是相當(dāng)?shù)暮唵?,核心如?行代碼即可:
Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jndi/db_test");
如果項(xiàng)目中引入了 Spring 上述兩行代碼都可以省了,變動注入數(shù)據(jù)源配置,如下:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。