作者ashen (ashen)
看板java
標題Re: [問題] java程式操作連線池的問題
時間Thu Mar 26 04:09:01 2015
※ 引述《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://webptt.com/m.aspx?n=bbs/java/M.1427314145.A.982.html
1F:推 lueichun: 我現在的理解是如果成是要從連線池取得連線的話 03/26 23:17
2F:→ lueichun: 首先在comtext.xml設定連線管理工具,相當於是 03/26 23:18
3F:→ lueichun: new一個連線管理工具的物件在xml檔裡,這個物件的名稱 03/26 23:20
4F:→ lueichun: 就是jdbc/xxx 之後程式要利用這個連線管理工具從連線池 03/26 23:21
5F:→ lueichun: 取得連線,因此call initialContext(),取出剛剛new的 03/26 23:23
6F:→ lueichun: 管理工具物件 然後再利用資料庫的名稱(jndi/xxx)找到資 03/26 23:25
7F:→ lueichun: 料庫 回傳datasource物件 03/26 23:29
8F:→ lueichun: 只是我在這邊就卡住了 不懂datasource物件為何可以 03/26 23:32
9F:→ lueichun: getConnection 在JDBC對應的方法叫driverManager.getCon 03/26 23:32
10F:→ lueichun: ection datasource跟driverManager不管怎麼看都不像 03/26 23:33
11F:→ lueichun: 為何會有一樣的方法 03/26 23:34
12F:推 lueichun: 自問自答一下 在JAVA程式如果要用連線池連線到資料庫 03/29 00:19
13F:→ lueichun: 的話 SUN官方有推出相對應的規格 叫做JNDI API 這份API 03/29 00:20
14F:→ lueichun: 是由各家伺服器去實作 我們只要拿來用就可連線到資料庫 03/29 00:21
15F:→ lueichun: 第一步是要設定連線到資料庫的相關資訊 就是設定 03/29 00:23
16F:→ lueichun: 連線池的內容 連線池對應到JNDI API的物件就叫做 03/29 00:26
17F:→ lueichun: dataSource物件 所以dataSource物件本身既包含資料庫連 03/29 00:28
18F:→ lueichun: 線資訊 也包含連線池的資訊 所以之後要取得連線的話 03/29 00:29
19F:→ lueichun: 就要從dataSource物件取得 所以dataSource物件之所以可 03/29 00:31
20F:→ lueichun: 以用來取得連線 就是因為其包含了連線池的資訊 03/29 00:32
21F:推 haha02: JNDI跟連線池&DataSource沒有絕對關係 你的理解有誤 03/29 03:00
22F:推 lueichun: 我修正一下想法 連線池是伺服器根據SUN的規範去實作的 03/29 15:50
23F:→ lueichun: 而連線池在SUN官方是定義成DataSource物件 所以在java程 03/29 15:51
24F:→ lueichun: 式裡面只要取得DataSource物件就等於取得連線池 而要取 03/29 15:52
25F:→ lueichun: 得這物件 就要以這物件(連線池)的名稱搭配命名服務來取 03/29 15:54
26F:→ lueichun: 得 命名服務可以用來取得連線池 也可以用來取得別的資源 03/29 15:55
27F:→ lueichun: 利用這服務取得連線池後 就可以call getConnection()了 03/29 15:55
28F:→ lueichun: 看來我前面的自問自答錯很大... 03/29 15:57