当前位置:首页 > 编程开发

Hibernate 3.1+Tomcat 5.5.X(配置JNDI篇)



热门软件下载:

正文:

【51cto.com独家特稿】一、引言

在tomcat从其5.0版本升级到5.5.x版本之后,它的配置发生了很多变化。这些改变明显地影响到tomcat jndi的建立,这反过来又影响到hibernate—假定你想在自己的hibernate安装中利用tomcat jndi所提供的方便的datasource配置的话。

另外,在hibernate从其3.0版本升级到3.1版本的过程中,在有关获取线程安全的hibernate会话方面也进行了极大的简化。

从hibernate的角度来观察,tomcat是一种混合的环境。tomcat提供一个jndi和datasource—它们都不是一个独立的应用程序。这个datasource工具为实现应用程序服务器的可移植性提供了方便。但是,就象一个独立的环境一样,tomcat并没有提供事务管理器;因此,你的代码中必须使用hibernate事务管理器。

到目前为止,我们很难找到有关这两个新版本框架联用的完整的描述—在因特网,甚至在hibernate.org站点(http://www.hibernate.org)上都未曾发现。而在其它一些地方找到的相关信息都已过时。原先的hibernate 3.0参考文档中提供了有关hibernate/tomcat集成(基于tomcat 4.1)的很有用的一章,但在当前hibernate 3.1的参考文档中已经删除了原有的这一章。因此,我们十分希望,本系列文章(三篇)会对你的工程开发中在新版本的hibernate和tomcat联用方面助一臂之力。

二、context.xml文件

在tomcat的早期版本中,你必须经由服务器范围的配置文件—server.xml来配置tomcat jndi。为此,你需要在这个文件内包括多个元素,相应于每一个datasource建立一个元素。在tomcat 5.5中,你不再需要使用这个服务器范围的文件来配置jndi。而是,你只需要把一个应用程序范围的context.xml放到你的meta-inf目录—例如“c:\tomcat 5.5\webapps\basicweb\meta-inf\context.xml”下。(注意:你可能会在网上看到许多参考资料,其中说,这个文件应该根据你的应用程序命名—例如yourapp.xml。其实,这是错误的—你应该使用固定的文件名context.xml。)

下面图1中的屏幕快照展示了在你的tomcat目录层次下的context.xml文件的位置:

 



在你的应用程序的context.xml文件中,相应于每一个datasource你都应该包括一个元素。这个元素提供了一组定义datasource的属性,但是没有子元素。下面是一个应用程序完整的context.xml文件内容。注意,在此仅要求使用一个datasource:



  docbase="c:\tomcat 5.5\webapps\basicweb"

workdir="c:\tomcat 5.5\webapps\basicweb">

    type="javax.sql.datasource"

maxactive="100" maxidle="30" maxwait="10000"

username="sam" password="sam123"

driverclassname="com.mysql.jdbc.driver"

url="jdbc:mysql://localhost:3306/sampdb?autoreconnect=true"/>

上面的元素具有创建一个tomcat jndi datasource入口的作用。当tomcat服务器初始启动时,这个jndi及这个相应的jndi入口即被创建。站在从jndi中检索信息的角度来看,这个jndi datasource入口与一个应用程序服务器中的这样的一个入口没有什么不同。(然而,在tomcat启动周期完成之后,这个tomcat jndi是只读的。在tomcat操作过程中,你的定制应用程序和hibernate都不能够添加或修改这个jndi中的入口)

顺便说一下,本系列的几篇中都可能会使用mysql作为数据存储方式,这正如你在上面的元素中所见的。

不仅hibernate能够使用tomcat jndi,你的原始jdbc也能够存取jndi,其方式与你从一个应用程序服务器的一个jndi中存取一个datasource的方式完全一致。下面代码片断来自于一个servlet中,它从上面的jndi元素中获得一个jndi连接,并且使用原始jdbc(不是hibernate)来执行数据库查询。

initialcontext initctx = new initialcontext();

datasource ds = (datasource)initctx.lookup("java:comp/env/jdbc/sampdb");

connection conn = ds.getconnection();

statement stmt = conn.createstatement();

resultset rs = stmt.executequery("select * from car");

在本篇中,我们提供了一个完整的servlet源码实现。我们的目的是为了展示hibernate 3.1和tomcat 5.5函数是如何协作的(后面两篇中的示例也是这一目的)。而且,这些代码是很容易理解的—不同于你将正式发布的具有商业质量的代码—它们会包括完整的异常处理以及其它实践(例如使用mvc模式,这与本文中我们的目的毫无关系)。(你当然会使用一个jsp而不是一个servlet作为你的视图组件。但是,即使添加少部分的mvc模式内容也会干扰我们所讨论的主要内容—hibernate和tomcat的联合问题。)

在此,我们列出本文第一个完整的servlet示例源码:

package tomcatjndi;

import java.io.ioexception;

import java.io.printwriter;

import java.sql.*;

import javax.sql.*;

import javax.naming.*;

import javax.servlet.servletexception;

import javax.servlet.http.httpservlet;

import javax.servlet.http.httpservletrequest;

import javax.servlet.http.httpservletresponse;

public class retrieval extends httpservlet {

/**

*对象的构造函数

*/

public retrieval() {

super();

}

public void doget(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

response.setcontenttype("text/html");

printwriter out = response.getwriter();

out

.println("");

out.println("");

out.println("  ");

out.println("  ");

try  {

initialcontext initctx = new initialcontext();

datasource ds = (datasource)initctx.lookup("java:comp/env/jdbc/sampdb");

connection conn = ds.getconnection();

out.println("

");

out.println("connection from datasource successfully opened!

");

statement stmt = conn.createstatement();

resultset rs = stmt.executequery("select * from car");

while (rs.next() )  {

string onerow = "car manufacturer: " + rs.getstring("manufacturer")

+ ,"  model: "  + rs.getstring("model")

+ ,"  year: "  + rs.getstring("year") + "

";

out.println(onerow);

}

rs.close();

stmt.close();

conn.close();

initctx.close();

out.println("

");

out.println("connection from datasource successfully closed!

");

}

catch(exception e)  {

out.println("

");

out.println("connection from datasource not successfully opened!

");

out.println(e.getmessage() + "

");

}

out.println("  ");

out.println("");

out.flush();

out.close();

}

public void init() throws servletexception {

//在此加入你的代码

}

} //类retrieval结束

注意,就象任何一个正常应用程序服务器一样,tomcat实际上也自动提供了数据库连接池支持。在tomcat情况下,连接池支持是由dbcp组件提供的。在前面展示的xml元素中,maxactive="100"属性意味着连接池最大应该支持具有100个的活动连接。

三、小结

在本篇中,我们集中讨论了tomcat 5.5.x jndi的配置问题。上面展示的context.xml文件,不需作任何修改即可支持hibernate。事实上,为了从hibernate中使用tomcat jndi,这样的一个文件也是必需的。

 ↓相关文章:
© 2006-2008 All Rights Reserved