|
锁定老贴子 主题:有谁知道tomcat如何初始化DBCP的?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2004-03-03
tomcat的server.xml中配置DBCP,<Context ...> ....</Context>初始化org.apache.commons.dbcp.BasicDataSourceFactory类,并启动了dbcp的jndi服务,这个过程有谁清楚吗?大概指点一下哦。
我现在糊涂的是绑顶到jndi上面的是BasicDataSourceFactory类还是BasicDataSource类呢? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间: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] |
|
| 返回顶楼 | |
|
时间: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] |
|
| 返回顶楼 | |
|
时间: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熟悉的吗? |
|
| 返回顶楼 | |
|
时间:2004-03-04
绑定到JNDI上的一般来说是java.naming.Reference或java.naming.Referenceable的实现。Tomcat并没有直接使用BasicDataSource。我想它应该是将javax.sql.DataSource和BasicDataSourceFactory包装进一个Reference中,通过Reference的getFactoryClassName()获得BasicDataSourceFactory,从而得到BasicDataSource。
|
|
| 返回顶楼 | |
|
时间:2004-03-04
你的问题似乎涉及到jndi树的实现,这个我也不清楚,现在也没有时间去研究,sorry:(
帮你up一下,看看谁知道。 |
|
| 返回顶楼 | |
|
时间: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)就可以了。 一个人总有这样那样的事情,没时间追究这些,等到以后搞明白了我在贴出来。 |
|
| 返回顶楼 | |
|
时间:2004-03-04
jaqwolf 写道 你的问题似乎涉及到jndi树的实现,这个我也不清楚,现在也没有时间去研究,sorry:(
帮你up一下,看看谁知道。 是啊,还有jndi,我也是一知半解,google里面搜索了好多次,也没发现一个介绍原理详细一点的文章。e文不好,没有时间很难啃完,现在Java里面的名词概念真的是铺天盖地,再加上各种框架、工具,学不过来啊,郁闷。到现在Ant我都不太会用 ,更别说eclipse了 |
|
| 返回顶楼 | |
|
时间:2004-03-04
我很早前在jdon上写过一个比较详细的介绍JNDI原理的帖子,搜搜看,最近也没有时间去整理。
|
|
| 返回顶楼 | |
|
时间: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] |
|
| 返回顶楼 | |











