浏览 3300 次
锁定老帖子 主题:tomcat架构分析 (JNDI配置)
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-06-07
最后修改:2012-06-13
---百度百科 通俗点说,JNDI封装了一个简单name到实体对象的mapping,通过字符串可以方便的得到想要的对象资源。通常这种对象资源有很多种,例如数据库JDBC,JMS,EJB等。平时用的最多的就是数据库了。在tomcat中,这些资源都是以java:comp/env开头的字符串来绑定的。以数据库连接为例,我们在app中的调用场景是; //获得对数据源的引用: Context ctx = new InitalContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB"); //获得数据库连接对象: Connection conn = ds.getConnection(); //返回数据库连接到连接池: conn.close(); 因为经常看到有人问怎么在tomcat中配置数据库连接池等问题,这篇文章就对tomcat中的JNDI的配置做一个小结,不涉及tomcat代码方面。tomcat架构分析 (JNDI体系绑定),从代码原理角度专门说明这些配置是如何生效,其底层如何实现的。 Tomcat内部有一堆类型的resource配置。这些类型的resource的配置大体上可分为两个层次来进行,这两个层次是并列的关系,分别针对不同的开发部署方案设定的。 第一种方案 这种方案主要是对于快速部署而言,其核心是tomcat本身有一个global的resource池,新部署的app只引用其中已有的resouce,而不是创建新的resource。 先看看<tomcat>/conf/server.xml <Server port="8005"> <GlobalNamingResources> <Resource name="jdbc/mysql" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" maxIdle="200" maxWait="5000" url="……" maxActive="100"/> </GlobalNamingResources> …… </Server> 这是一个全局的配置,这时如果每个具体的context(webapp)中如果要引用这个resource,则需要在各个context对象中配置 resourcelink,然后在各个app的web.xml中配置<resource-ref>. <tomcat>/conf/server.xml <Server port="8005"> <Service> <Engine> <Host> <Context> < ResourceLink globalname=" jdbc/mysql " name="myDB" type="…"/> </Context> </Host> </Engine> </Service> …… </Server> 或者在每个app的Context.xml中配置 <Context> < ResourceLink globalname=" jdbc/mysql " name="myDB" type="…"/> </Context> 然后在app的WEB-INF/web.xml中配置 <web-app> <resource-ref> <description/> <res-auth/> <res-ref-name>myDB</res-ref-name> <res-sharing-scope/> <res-type/> </resource-ref> </web-app> 代码中这么调用 //获得对数据源的引用: Context ctx = new InitalContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/myDB"); //获得数据库连接对象: Connection conn = ds.getConnection(); //返回数据库连接到连接池: conn.close(); 由此可见,context中配置的ResourceLink属于一个中转的作用,这主要是为了在tomcat启动状态下,如果新部署一个app,可以在app中指定到相应的全局的resource。 它们的mapping关系是; Tomcat这种资源不限于数据库连接,还有很多例如EJB,Web Service等,在配置中它们分别对应不同的节点。例如上面的数据库连接,在server.xml中对应<Resource>,在web.xml中对应的是<resource-ref>,EJB连接在server.xml中对应<Ejb>,在web.xml中对应的是<ejb-ref>等,因为有些资源在现在的开发中应用的不是很多,就不一一例举了,总结一下它们所有的对应关系; 第二种方案 没有上述方案那么麻烦,主要是为了需要引用一个自己独有的资源对象的app而言。 <tomcat>/conf/server.xml <Server port="8005"> <Service> <Engine> <Host> <Context> <Resource name="jdbc/mysql" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" maxIdle="200" maxWait="5000" url="……" maxActive="100"/> </Context> </Host> </Engine> </Service> …… </Server> 或者在每个app的Context.xml中配置 <Context> <Resource name="jdbc/mysql" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" maxIdle="200" maxWait="5000" url="……" maxActive="100"/> </Context> 这种方式,不需要在app的WEB-INF/web.xml中再设定resource-ref了,直接在程序中就可lookup到相应的对象。 代码中这么调用 //获得对数据源的引用: Context ctx = new InitalContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql"); //获得数据库连接对象: Connection conn = ds.getConnection(); //返回数据库连接到连接池: conn.close(); 比较一下,两种方式的配置,调用java:comp/env的name时还是不一样的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-06-13
tomcat架构分析 (JNDI体系绑定),从代码原理角度专门说明这些配置是如何生效,其底层如何实现的。
|
|
返回顶楼 | |