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

作者: ashen (ashen)   2015-03-26 04:09:01
※ 引述《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數量)
: 希望有大大可以解惑(套色部分),謝謝
作者: lueichun (no anonymous)   2015-03-26 23:17:00
我現在的理解是如果成是要從連線池取得連線的話首先在comtext.xml設定連線管理工具,相當於是new一個連線管理工具的物件在xml檔裡,這個物件的名稱就是jdbc/xxx 之後程式要利用這個連線管理工具從連線池取得連線,因此call initialContext(),取出剛剛new的管理工具物件 然後再利用資料庫的名稱(jndi/xxx)找到資料庫 回傳datasource物件只是我在這邊就卡住了 不懂datasource物件為何可以getConnection 在JDBC對應的方法叫driverManager.getConection datasource跟driverManager不管怎麼看都不像為何會有一樣的方法
作者: haha02 (來人!上夾棍!)   2015-03-29 03:00:00
JNDI跟連線池&DataSource沒有絕對關係 你的理解有誤
作者: lueichun (no anonymous)   2015-03-29 15:50:00
我修正一下想法 連線池是伺服器根據SUN的規範去實作的而連線池在SUN官方是定義成DataSource物件 所以在java程式裡面只要取得DataSource物件就等於取得連線池 而要取得這物件 就要以這物件(連線池)的名稱搭配命名服務來取得 命名服務可以用來取得連線池 也可以用來取得別的資源利用這服務取得連線池後 就可以call getConnection()了看來我前面的自問自答錯很大...

Links booklink

Contact Us: admin [ a t ] ucptt.com