Re: [問題] java程式操作連線池的問題

看板java作者 (ashen)時間10年前 (2015/03/26 04:09), 編輯推噓4(4024)
留言28則, 2人參與, 最新討論串1/1
※ 引述《lueichun (no anonymous)》之銘言: : 如果現在想要在java程式連線到資料庫 : 除了使用JDBC API : 也可以設定連線池取得連線 : 我的理解是先在context.xml加入這幾行設定: : https://www.dropbox.com/s/x1t2l71imsy53qa/%E6%93%B7%E5%8F%96103.png?dl=0 : 用來設定連線到資料庫的資訊與連線池的設定 : 但是我不是很清楚在這邊設定資料庫連線資訊 : 跟用JDBC API的方式來連線差在哪裡(是因為效能的關係嗎) 根據小弟的粗淺認知,好處大概是: 1. ap server幫你管理好db connection數量、釋放資源、錯誤處理等等 2. 未來若是佈署環境有變動,例如更換ap server,只要在ap server端改設定 可以"盡量"不去動到程式碼 **暗黑效果** 3. 有些ap server的設定檔藏得很好,好到你只會想用管理介面來修改設定,比起 用properties的方式安全點 : 而且我也不是很懂連接資料庫的資訊跟連線池的設定 : 為何可以被包在同一個tag裡,一起做設定 : 因為資料庫跟連線池應該是兩個分開的部分 : 然後設定name="jdbc/xxxx"的部分,google到的說法是要設定jndi name : jndi name是可以理解成: : java程式為取得連線池的連線以連接資料庫 jndi是存取資源的一種統一介面,不僅僅只有存取資料庫連線的功能而已 只要server端提供jndi的實作,都可以透過jndi來存取,例如AD Server等 : 所以程式必須利用jndi name找到連線池 : 以取得連線嗎 你要在code裡面用jdbc硬幹也可以,只是這樣就沒了使用jndi的優點 : 這樣的話以下在web.xml裡的設定: : https://www.dropbox.com/s/u82pyuph48ye58i/%E5%9C%96%E7%89%871.png?dl=0 : 這裡又重複設定一次jndi name : 我就不懂了,不懂這裡再打一次的目的是什麼 參考你用的ap server所提供的手冊 : 最後在java程式裡面 : 產生dtasource物件並取得連線 : code長這樣: : https://dl.dropboxusercontent.com/u/63402326/%E5%9C%96%E7%89%872.png
: datasource物件之後會call getConnection取得連線 : 只是我覺得一個datasource不是表示一個資料庫嗎 DataSource是資料來源的泛稱,可以是資料庫,也可以是其他資料來源 : 資料庫內含取得連線池連線的方法(getConnection) : 感覺不太自然,畢竟資料庫跟連線池是兩個分開的東西 是說從資料庫給的api來取connection pool以後再拿到connection逆? 這樣幹的好處大概是connection取得跟釋放有connection pool幫忙管 不過最好了解一下相關設定(例如怎麼設定connection數量) : 希望有大大可以解惑(套色部分),謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.0.66 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1427314145.A.982.html

03/26 23:17, , 1F
我現在的理解是如果成是要從連線池取得連線的話
03/26 23:17, 1F

03/26 23:18, , 2F
首先在comtext.xml設定連線管理工具,相當於是
03/26 23:18, 2F

03/26 23:20, , 3F
new一個連線管理工具的物件在xml檔裡,這個物件的名稱
03/26 23:20, 3F

03/26 23:21, , 4F
就是jdbc/xxx 之後程式要利用這個連線管理工具從連線池
03/26 23:21, 4F

03/26 23:23, , 5F
取得連線,因此call initialContext(),取出剛剛new的
03/26 23:23, 5F

03/26 23:25, , 6F
管理工具物件 然後再利用資料庫的名稱(jndi/xxx)找到資
03/26 23:25, 6F

03/26 23:29, , 7F
料庫 回傳datasource物件
03/26 23:29, 7F

03/26 23:32, , 8F
只是我在這邊就卡住了 不懂datasource物件為何可以
03/26 23:32, 8F

03/26 23:32, , 9F
getConnection 在JDBC對應的方法叫driverManager.getCon
03/26 23:32, 9F

03/26 23:33, , 10F
ection datasource跟driverManager不管怎麼看都不像
03/26 23:33, 10F

03/26 23:34, , 11F
為何會有一樣的方法
03/26 23:34, 11F

03/29 00:19, , 12F
自問自答一下 在JAVA程式如果要用連線池連線到資料庫
03/29 00:19, 12F

03/29 00:20, , 13F
的話 SUN官方有推出相對應的規格 叫做JNDI API 這份API
03/29 00:20, 13F

03/29 00:21, , 14F
是由各家伺服器去實作 我們只要拿來用就可連線到資料庫
03/29 00:21, 14F

03/29 00:23, , 15F
第一步是要設定連線到資料庫的相關資訊 就是設定
03/29 00:23, 15F

03/29 00:26, , 16F
連線池的內容 連線池對應到JNDI API的物件就叫做
03/29 00:26, 16F

03/29 00:28, , 17F
dataSource物件 所以dataSource物件本身既包含資料庫連
03/29 00:28, 17F

03/29 00:29, , 18F
線資訊 也包含連線池的資訊 所以之後要取得連線的話
03/29 00:29, 18F

03/29 00:31, , 19F
就要從dataSource物件取得 所以dataSource物件之所以可
03/29 00:31, 19F

03/29 00:32, , 20F
以用來取得連線 就是因為其包含了連線池的資訊
03/29 00:32, 20F

03/29 03:00, , 21F
JNDI跟連線池&DataSource沒有絕對關係 你的理解有誤
03/29 03:00, 21F

03/29 15:50, , 22F
我修正一下想法 連線池是伺服器根據SUN的規範去實作的
03/29 15:50, 22F

03/29 15:51, , 23F
而連線池在SUN官方是定義成DataSource物件 所以在java程
03/29 15:51, 23F

03/29 15:52, , 24F
式裡面只要取得DataSource物件就等於取得連線池 而要取
03/29 15:52, 24F

03/29 15:54, , 25F
得這物件 就要以這物件(連線池)的名稱搭配命名服務來取
03/29 15:54, 25F

03/29 15:55, , 26F
得 命名服務可以用來取得連線池 也可以用來取得別的資源
03/29 15:55, 26F

03/29 15:55, , 27F
利用這服務取得連線池後 就可以call getConnection()了
03/29 15:55, 27F

03/29 15:57, , 28F
看來我前面的自問自答錯很大...
03/29 15:57, 28F
文章代碼(AID): #1L4nNXc2 (java)
文章代碼(AID): #1L4nNXc2 (java)