论坛首页 Java版 Tomcat

有谁知道tomcat如何初始化DBCP的?

浏览 6413 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2004-03-03
tomcat的server.xml中配置DBCP,<Context ...> ....</Context>初始化org.apache.commons.dbcp.BasicDataSourceFactory类,并启动了dbcp的jndi服务,这个过程有谁清楚吗?大概指点一下哦。
我现在糊涂的是绑顶到jndi上面的是BasicDataSourceFactory类还是BasicDataSource类呢?
   
时间:2004-03-03
Step 1, 停止tomcat服务,打开tomcat的主配置档server.xml, 将以下内容添加在适当位置。(一般就是添加到</host>前面)

[code:1]<!-- The context of testWeb module -->

<Context path="/testWeb" docBase="testWeb" debug="0">

<Resource name="jdbc/testdb" auth="Container" type="javax.sql.DataSource"/>

<ResourceParams name="jdbc/testdb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name> <value>jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8</value>
</parameter>
<parameter>
<name>username</name>
<value>richard</value>
</parameter>
<parameter>
<name>password</name>
<value>123456</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
</ResourceParams>

</Context>

<!-- end of the context of testWeb module -->[/code:1]

Step 2, 配置testWeb应用的web.xml
完成修改后的文件如下:

[code:1]<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>testWeb module</display-name>
<description>
This is a web module for testing purpose created by Richard Huang.
</description>
<resource-ref>
<description>database connection pool example</description>
<res-ref-name>jdbc/testdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>[/code:1]
   
0 请登录后投票
时间:2004-03-03
[code:1]/**
* 从连接池中取得一个空闲的数据库连接
* @return Connection
* @exception Exception
*/
public static Connection getConnection() throws Exception{
Connection conn = null;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/" + jndiName);
conn= ds.getConnection();
} catch(Exception e) {
e.printStackTrace();
throw e;
}
return conn;
}[/code:1]
   
0 请登录后投票
时间:2004-03-03
非常感谢jaqwolf !


我现在迷惑的是这样一个事情:
在server.xml中配置DBCP, tomcat初始化DBCP并绑定到JNDI上使用的是BasicDataSourceFactory类,该factory主要是实现了ObjectFactory接口。
[code:1]
public class BasicDataSourceFactory
implements ObjectFactory
{

public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment){。。。}

}
[/code:1]

而在如下代码中自己显示声明DBCP连接池并把它绑定到jndi上,使用的是 BasicDataSource类。
[code:1]
try{
Context initCtx1 = (Context)new InitialContext();
BasicDataSource bds = new BasicDataSource();

bds.setUrl("jdbc:mysql://localhost/mydb");
bds.setUsername("root");
bds.setPassword("root");
bds.setDriverClassName("org.gjt.mm.mysql.Driver");
bds.setMaxWait(3000L);
bds.setMaxIdle(10);
bds.setMaxActive(100);
initCtx1.rebind("my_datasource",bds);

}catch(Exception e){
e.printStackTrace();
}
[/code:1]

我想知道tomcat是怎样使用BasicDataSourceFactory初始化后得到BasicDataSource对象的,看了BasicDataSourceFactory的代码,望文生义觉得就是用fanctory获得一个具体的dataSource对象,但tomcat在这个过程中都作了那些细节工作就茫然了,有谁对tomcat熟悉的吗?
   
0 请登录后投票
时间:2004-03-04
绑定到JNDI上的一般来说是java.naming.Reference或java.naming.Referenceable的实现。Tomcat并没有直接使用BasicDataSource。我想它应该是将javax.sql.DataSource和BasicDataSourceFactory包装进一个Reference中,通过Reference的getFactoryClassName()获得BasicDataSourceFactory,从而得到BasicDataSource。
   
0 请登录后投票
时间:2004-03-04
你的问题似乎涉及到jndi树的实现,这个我也不清楚,现在也没有时间去研究,sorry:(
帮你up一下,看看谁知道。
   
0 请登录后投票
时间:2004-03-04
SunOne 写道
绑定到JNDI上的一般来说是java.naming.Reference或java.naming.Referenceable的实现。Tomcat并没有直接使用BasicDataSource。我想它应该是将javax.sql.DataSource和BasicDataSourceFactory包装进一个Reference中,通过Reference的getFactoryClassName()获得BasicDataSourceFactory,从而得到BasicDataSource。


嗯,我猜想肯定有一个规范,只要按这个规范实现一个Object和ObjectFactory,那么直接把他们交给Tomcat(写入Server.xml)就可以了。
一个人总有这样那样的事情,没时间追究这些,等到以后搞明白了我在贴出来。
   
0 请登录后投票
时间:2004-03-04
jaqwolf 写道
你的问题似乎涉及到jndi树的实现,这个我也不清楚,现在也没有时间去研究,sorry:(
帮你up一下,看看谁知道。


是啊,还有jndi,我也是一知半解,google里面搜索了好多次,也没发现一个介绍原理详细一点的文章。e文不好,没有时间很难啃完,现在Java里面的名词概念真的是铺天盖地,再加上各种框架、工具,学不过来啊,郁闷。到现在Ant我都不太会用 ,更别说eclipse了
   
0 请登录后投票
时间:2004-03-04
我很早前在jdon上写过一个比较详细的介绍JNDI原理的帖子,搜搜看,最近也没有时间去整理。
   
0 请登录后投票
时间:2004-03-04
好久以前研究过JNDI,还记得一些:)
1 关于jndi
JNDI本质上相当于一个Hashtable,和J2ee里面其他技术一样,也只是一个spec罢了,在此基础上,各个容器厂上提供了自己的JNDI实现。有的简单有的复杂,实际上TOMCAT的jndi实现就是一个Hastable。
2.JNDI 初始化
我们初始化JNDI一般使用这样的方式:
Context ctx = new InitialContext();
实际上,这里面发生很多事情
各个容器厂商实现JNDI的实现实际上是实现 Interface javax.naming.Context 而InitialContext由spec实现。
InitialContext 的内部大概是这个样子
public class InitialContext{
private instance Context;
}
InitialContext初始化的时候,根据环境变量,通过Naming Manager来确定使用那个context factory 得到真正的 instance
context factory 实际上是一个abstract factory 具体定义在InitialContextFactory
关于环境变量定义,具体可以看这里
http://java.sun.com/products/jndi/tutorial/beyond/env/context.html
在容器初始化的时候,已经将这些环境变量设置好了
所以在容器里面我们可以直接使用Context ctx = new InitialContext();
来得到context,但是在容器外面则有可能失败
比如我们在tomcat中,我们使用
Context ctx = new InitialContext();
System.out.println(ctx.getEnvironment().get(Context.INITIAL_CONTEXT_FACTORY));
可以得知TOmcat的INITIAL_CONTEXT_FACTORY为
org.apache.naming.java.javaURLContextFactory

3.Tomcat jndi的初始化,没有研究过:(
但是可以认为,其和 server.xml中 Resource Element有关系
一个Resource element应该就是一个JNDI的绑定
element下factory 子element类定义了factory的名称
初始化的时候,利用反射得到factory类,然后得到真正的绑定对象,并将其绑定到context上
factory要求实现javax.name.ObjectFactory
比如hibernate文档中就有一个例子,讲述了如何把hibernate 的SessionFactory 绑定到tomcat 的JNDI context上去
http://www.hibernate.org/114.html
Tomcat 也有比较详细的文档
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-resources-howto.html#Adding%20Custom%20Resource%20Factories


4ObjectFactory
当初研究过,现在忘光了,,,,
呵呵,当初看huihoo的人说要自己写容器,然后自己有雄心壮志来看spec 现在别人的容器已经写好了,我还是这种感兴趣学电,那种感兴趣学电,结果什么都不精通,惭愧啊




[/url]
   
0 请登录后投票
论坛首页 Java版 Tomcat

跳转论坛:
JavaEye推荐