选择显示字体大小

在weblogic上配置hibernate为jndi


  一、首先需要把hibernate 用到的jar包和配置文件都放到weblogic能够搜索到的classpath路径上。单单这一步就有很多人很迷茫,其实去仔细看看weblogic的启动脚本文件startweblogic.cmd和startwls.cmd,我想大部分人都知道该怎么配置了。

  我机器上的有个hibernate的项目,在d:\test\oracle目录下,该目录下的结构是:

d:\test\oracle\lib 放置hibernate的所有jar包
d:\test\oracle\src 放置源代码
d:\test\oracle\classes 编译好的代码和hibernate的配置文件(hibernate.properties, log4j.properties, cache.ccf)

  现在需要把d:\test\oracle\lib目录下那些jar文件和d:\test\oracle\classes目录都放置到weblogic的 classpath里面去,所以修改mydomain里面的weblogic启动脚本startweblogic.cmd,在启动weblogic之前,插入设置classpath的命令,如下:

@rem set hibernate classpath
set hibernate_lib=d:\test\oracle\lib
set hibernate_classes=d:\test\oracle\classes
set classpath=%classpath%;%hibernate_lib%\cglib-asm.jar;%hibernate_lib%\commons-beanutils.jar;
%hibernate_lib%\commons-collections.jar;%hibernate_lib%\commons-lang.jar;
%hibernate_lib%\commons-logging.jar;%hibernate_lib%\dom4j-full.jar;
%hibernate_lib%\hibernate2.jar;%hibernate_lib%\jcs.jar;
%hibernate_lib%\log4j-1.2.8.jar;%hibernate_lib%\odmg.jar;
%hibernate_lib%\jta.jar;%hibernate_classes%;

  下面一行,就是本来脚本里面的启动命令:

@rem call weblogic server
call "c:\bea\weblogic700\server\bin\startwls.cmd"

  二、在weblogic上配置 oracle数据库的连接池。这一步本来和hibernate无关,但是如果你想要使用ejb,想要使用jta,那么必须使用weblogic提供的连接池,而不能使用hibernate自带的连接池,或者其它第三方连接池,否则容器将无法管理数据库事务。这一步很简单,就是在weblogic console里面配置connection pool和txdata source,我的txdatasource取名称为“mypool”

  三、修改hibernate.properties。使用weblogic的连接池,而不是自带的连接池。我修改的是d:\test\oracle\classes\hibernate.properties,增加如下行:

hibernate.dialect.net.sf.hibernate.dialect.oracledialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class.net.sf.hibernate.connection.datasourceconnectionprovider
hibernate.session_factory_name hibernate.session_factory

  注意最后一行,这是使用 hibernate来绑定jndi给jndi起的名称,本来应该是hibernate/session_factory,但是weblogic要求改为. 号,不过在程序中lookup的时候还是要写hibernate/session_factory

  另外提到一点的是

hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25

  分别对数据库查询和插入有很大的性能影响,调节这两个选项可以得到最好的性能。

  为了保证sessionfactory实例的预创建,使用weblogic的t3startupdef接口创建一个startup类,在weblogic启动的时候运行:

package com.javaeye;

import java.util.hashtable;
import weblogic.common.t3startupdef;
import weblogic.common.t3servicesdef;
import.net.sf.hibernate.cfg.configuration;
import.net.sf.hibernate.sessionfactory;

public class hibernatestartup implements t3startupdef {

 public void setservices(t3servicesdef services) {}

 public string startup(string name, hashtable args) throws exception {
  sessionfactory sf = new configuration().configure().buildsessionfactory();
  return "hibernate startup completed successfully";
 }
}

  代码非常简单,其实就是确保预先运行

sessionfactory sf = new configuration().configure().buildsessionfactory();

  把sf创建出来,而hibernate会自行调用一系列类方法,把sf绑定到weblogic的的jndi树下的hibernate/session_factory路径中。

  4、编译hibernatestartup.java

  编译这个源代码的时候需要注意的是,要把weblogic.jar包和hibernate所有的相关包和配置文件导入。我是把这个源代码放到d:\test\oracle\src目录下的,用早已编写好的ant脚本运行一下就编译好了,并且编译好的 class文件被放置到d:\test\oracle\classes目录下,该目录已经被加入到weblogic的classpath里面,因此很省事。

  五、配置startup类

  启动weblogic,打开console控制台,在左边的applet树上找到startup & shutdown,然后在右边点击“configure a new startup class...”,在name框里面随便填写,在classname里面填写你编写的startup类,我填写的是 com.javaeye.hibernatestartup,然后点击“apply”。然后切换到target这选项卡,在target-server左边的 avaiable框里面选择“myserver”,点击右箭头,把它挪到右边的“chosen”框里面去,最后再点击一下“apply"按钮。如果此时 weblogic的dos窗口里面没有出错信息,那么应该已经配置成功了。

  六、现在关闭weblogic,再重新运行 startwelogic.cmd,启动weblogic,观察dos窗口的输出信息,可以看到hibernate的初始化信息一屏屏的滚动输出,证明已经配置成功。现在再打开console控制台,点击左边applet树中的serversmyserver,然后可以在右边最下面找到“view jndi tree ”,点击它,会打开一个浏览器窗口,显示jndi树,这时你可以看到一个名称为hibernate的jndi对象,在左边的applet树中点击它,看右边的详细信息,我的机器上的信息如下:

bind name: hibernate
object class:.net.sf.hibernate.impl.sessionfactoryimpl
object hash code: 454492
object to string:.net.sf.hibernate.impl.sessionfactoryimpl@6ef5c

  完全正确!

  最后你可以随意在ejb或者servlet/jsp里面使用jnd查找来获得sessionfactory了。

  例如:

context ctx = new initialcontext();
sessionfactory sf = (sessionfactory) ctx.lookup("hibernate/session_factory");

  请注意:上述代码只能在weblogic容器内运行,而不能在weblogic容器外运行。因为sessionfactory并没有实现序列化接口,因此当客户端程序(在另一个单独的jvm中运行)远程访问weblogic jndi,企图将sessionfactory序列化到本地,肯定会失败。但即使sessionfactory实现序列化接口,由于它不是一个可以支持rmi的对象,仍然无法在weblogic容器外正常调用。

  与此不同的是,weblogic本身的datasource,ejbjms等等都是支持rmi的(前提条件是weblogic相应的jar要有),所以你可以在weblogic外面lookup,并且使用它。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons