作者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/cn.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