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