中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺析 JNDI / DataSource / ConnectionPool 三者

發布時間:2020-06-05 08:12:27 來源:網絡 閱讀:287 作者:jjjssswww 欄目:數據庫

最近有個用戶量 5W-10W 的 web 應用,頻繁導致 weblogic 崩潰,讓運維組很難受。

   通過幾天跟蹤系統日志和 weblogic 運行狀況,發現報錯的姿勢有很多,其中對定位問題比較關鍵的報錯:

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 應用使用的線程響應返回周期最大為10分鐘,線程遲遲無法返回結果導致阻塞,并且這樣的刺頭線程越來越多。

   運行一段時間后達到 weblogic 阻塞線程的閥值,weblogic 自然就崩潰了。

   剛開始也試著調大 weblogic 響應周期/阻塞線程的閥值,但是阻塞線程還是會存在并且很快達到閥值。

   仔細比對奔潰前后日志,查看 weblogic 阻塞線程詳情,導致阻塞開始罪魁禍首是數據庫查詢需要很長時間。

   該系統與內外圍很多廠商系統有進行數據交互,數據庫里面旁根錯雜的 db_link/synonyms/view/procedure。

   而且是老舊項目,代碼經過很多人修改,已經風燭殘年搖搖欲墜,俺想重造它不是一天兩天了,因為很多原因無法進行,很無奈。

   規范數據庫中的交互流程?然后動代碼?oh,no! 限定解決的期限將至,不能拖。

   所有最后將目光放到數據庫連接池這部分,也使我不得不重新審視這塊對于 web 項目的重要性。好了,言歸正傳。

回到頂部

1. DataSource / ConnectionPool /  JNDI 三者關系

   淺析 JNDI / DataSource / ConnectionPool 三者

   DataSource:數據源是在 JDBC2.0 中引入的一個概念;

   在 JDBC 擴展包中定義了Java.sql.DataSource 接口,它負責建立與數據庫的連接;

   在應用程序訪問數據庫是不必編寫連接數據庫的代碼,可直接從數據源獲得數據庫連接。

   ConnectionPool :在數據源中初始化建立了多個數據庫連接,這些數據庫連接保存在連接池(ConnectionPool)中。

   Java程序訪問數據庫時,只需從連接池中取出空閑狀態的數據庫連接,當訪問結束時,將數據庫連接返回給連接池。

   JNDI : (Java Naming and Directory Interface)Java命名與目錄接口;

   為開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口。

   其實可以將 JNDI 理解為一種對象和名字綁定的技術,即指定一個資源名稱,將該名稱與某一資源或服務相關聯。

   結合圖和上面的簡述,數據層關鍵性對象都已展露無遺,同樣也很容易理解。

   JNDI 避免了程序與數據庫之間的緊耦合,使應用更加易于配置、易于部署。

回到頂部

2. 配置 JNDI 數據源的方式和使用

   weblogic 上配置 JNDI 為圖形界面,操作起來很方便,而且那是運維組的事情,術業有專攻。

   這里我拿 Tomcat 為例(開發時你也不可能在本機裝個 weblogic 調試吧),簡述下配置 JDNI 的幾種方式:

a. 全局使用:Tomcat 的 conf 文件夾下的 context.xml  配置文件中添加:

淺析 JNDI / DataSource / ConnectionPool 三者

<Resource name="jndi/db_test"   
            auth="Container"   
            type="javax.sql.DataSource"   
            driverClassName="com.mysql.jdbc.Driver"   
            url="jdbc:mysql://localhost:3306/db_test"   
            username="root"   
            password="123456"   
            maxActive="20"   
            maxIdle="10"   
            maxWait="10000"/>

淺析 JNDI / DataSource / ConnectionPool 三者

b.局部使用:Tomcat 的 conf 文件夾下 server.xml 的 <host> 標簽內添加:

淺析 JNDI / DataSource / ConnectionPool 三者

Context path="/demo_jndi" docBase="/demo_jndi">  
   <Resource  
     name="jndi/db_test"  
     type="javax.sql.DataSource"  
     driverClassName="com.mysql.jdbc.Driver"  
     maxIdle="2"  
     maxWait="5000"  
     username="root"  
     password="123456"  
     url="jdbc:mysql://localhost:3306/db_test"  
     maxActive="4"/>  </Context>

淺析 JNDI / DataSource / ConnectionPool 三者

 c.局部使用:應用 META-INFO 下新建 context.xml 添加:

淺析 JNDI / DataSource / ConnectionPool 三者

<?xml version="1.0" encoding="UTF-8"?>  <Context>  
    <Resource name="jndi/db_test"   
                auth="Container"   
                type="javax.sql.DataSource"   
                driverClassName="com.mysql.jdbc.Driver"   
                url="jdbc:mysql://localhost:3306/db_test"   
                username="root"   
                password="123456"   
                maxActive="20"   
                maxIdle="10"   
                maxWait="10000"/>      </Context>

淺析 JNDI / DataSource / ConnectionPool 三者

   上述幾種配置使用的數據源都為 javax.sql.DataSource,當然你也可以引入其他開源的數據源。

   也就是 web 容器使用其他的開源數據庫連接池,比如像下面這集中姿勢(記得將依賴的 jar 添加到容器的 lib 中):

淺析 JNDI / DataSource / ConnectionPool 三者

<Resource name="jndi/db_test"   
            auth="Container"
            //DBCP
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
        
            //C3P0
            type="com.mchange.v2.c3p0.ComboPooledDataSource"
            factory="org.apache.naming.factory.BeanFactory" 
              
            //Druid
            type="com.alibaba.druid.pool.DruidDataSource" 
            factory="com.alibaba.druid.pool.DruidDataSourceFactory"
            
            driverClassName="com.mysql.jdbc.Driver"   
            url="jdbc:mysql://localhost:3306/db_test"   
            username="root"   
            password="123456"   
            maxActive="20"   
            maxIdle="10"   
            maxWait="10000"/>

淺析 JNDI / DataSource / ConnectionPool 三者

   配置好之后,使用起來也是相當的簡單,核心如下2行代碼即可:

    Context ctx = new InitialContext();  
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jndi/db_test");

   如果項目中引入了 Spring 上述兩行代碼都可以省了,變動注入數據源配置,如下:

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName" value = "java:comp/env/jndi/db_test"/>  
    </bean>


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

a dat ce
AI

曲阜市| 威海市| 土默特右旗| 武乡县| 醴陵市| 商城县| 通州市| 淄博市| 庐江县| 宁海县| 峨山| 桐庐县| 广饶县| 都江堰市| 平利县| 庐江县| 株洲县| 闸北区| 封开县| 麟游县| 永仁县| 潼关县| 梁河县| 桃江县| 济源市| 兖州市| 调兵山市| 治多县| 望谟县| 阳信县| 宁德市| 宁河县| 德阳市| 南昌市| 八宿县| 卓资县| 临湘市| 南投市| 海林市| 锦屏县| 天峻县|