设为首页 收藏本站
查看: 626|回复: 0

[经验分享] Hibernate 3.1+Tomcat 5.5.X(配置JNDI篇)

[复制链接]

尚未签到

发表于 2017-2-1 10:08:27 | 显示全部楼层 |阅读模式
<script src="http://www.iyunv.com/php/ajax_art_2.js" language="javascript" type="text/javascript"></script>
Hibernate 3.1+Tomcat 5.5.X(配置JNDI篇)


<!---->


<!---->  【iyunv.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。为此,你需要在这个文件内包括多个<resourceparams></resourceparams>元素,相应于每一个DataSource建立一个<resourceparams></resourceparams>元素。在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文件的位置:
http://developer.iyunv.com/files/uploadimg/20061127/133603369.jpg 
在你的应用程序的Context.xml文件中,相应于每一个DataSource你都应该包括一个<resource></resource>元素。这个<resource></resource>元素提供了一组定义DataSource的属性,但是没有子元素。下面是一个应用程序完整的Context.xml文件内容。注意,在此仅要求使用一个DataSource:

  


  <!---->
<context path="/BasicWeb" reloadable="true"></context>  docBase="C:\Tomcat 5.5\webapps\BasicWeb"
workDir="C:\Tomcat 5.5\webapps\BasicWeb">
<resource name="jdbc/Sampdb" auth="Container"></resource>    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"/>




  上面的<resource></resource>元素具有创建一个Tomcat JNDI DataSource入口的作用。当Tomcat服务器初始启动时,这个JNDI及这个相应的JNDI入口即被创建。站在从JNDI中检索信息的角度来看,这个JNDI DataSource入口与一个应用程序服务器中的这样的一个入口没有什么不同。(然而,在Tomcat启动周期完成之后,这个Tomcat JNDI是只读的。在Tomcat操作过程中,你的定制应用程序和Hibernate都不能够添加或修改这个JNDI中的入口)
  顺便说一下,本系列的几篇中都可能会使用MySQL作为数据存储方式,这正如你在上面的<resource></resource>元素中所见的。
  不仅Hibernate能够使用Tomcat JNDI,你的原始JDBC也能够存取JNDI,其方式与你从一个应用程序服务器的一个JNDI中存取一个DataSource的方式完全一致。下面代码片断来自于一个servlet中,它从上面的JNDI<resource></resource>元素中获得一个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("<html></html>");
out.println("  <head></head>");
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组件提供的。在前面展示的<resource></resource>xml元素中,maxActive="100"属性意味着连接池最大应该支持具有100个的活动连接。
  三、小结
  在本篇中,我们集中讨论了Tomcat 5.5.x JNDI的配置问题。上面展示的Context.xml文件,不需作任何修改即可支持Hibernate。事实上,为了从Hibernate中使用Tomcat JNDI,这样的一个文件也是必需的。

 



【导读】本系列文章(共三篇)旨在详细介绍当前高版本的Hibernate和Tomcat联用方面的知识,并通过几个简短示例对相应注意事项加以说明。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-336019-1-1.html 上篇帖子: 译How Tomcat Works(第四章) 下篇帖子: Using Log4j in Tomcat 6.0.x & 7.0.x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表