JiveJdon Community Forums
在线286人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
1 2 Go 总共有 26 回复 / 2
 发表新帖子   回复该主题贴
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 14:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表
我已经碰到过n次被人问到如何在Weblogic上把Hibernate配置到JNDI上的问题了,其实Hibernate的文档已经做出了解答(http://hibernate.bluemars.net/74.html),只不过给出的代码不全,也没有详细描述如何配置。我感觉到很多人对Weblogic本身的配置都不熟悉,所以还是不停的问我,我把详细步骤介绍一下,我的环境是Weblogic7.0,Oracle8.1.7,Hibernate2.0.1:

一、首先需要把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_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,我的Tx DataSource取名称为“mypool”

三、修改Hibernate.properties。使用Weblogic的连接池,而不是自带的连接池。我修改的是D:\test\oracle\classes\hibernate.properties,增加如下行:
hibernate.dialect net.sf.hibernate.dialect.OracleDialect
hibernate.connection.datasource mypool

#hibernate.connection.pool_size 1
#hibernate.statement_cache.size 25
注释掉
然后
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
去掉注释,这样就修改好了。

另外提到一点的是
hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25
分别对数据库查询和插入有很大的性能影响,调节这两个选项可以得到最好的性能。

四、自己写一个StartUp类,这个类要实现weblogic.common.T3StartupDef接口。Hibernate给出了这个类的代码片断,但是不全,我把它补全了,并且做了一些修改。代码如下:

package com.fankai;

import java.util.*;
import javax.naming.*;
import weblogic.common.T3StartupDef;
import weblogic.common.T3ServicesDef;
import org.apache.log4j.Logger;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;

public class WLSStartup implements T3StartupDef {

public static final String SESSION_FACTORY_JNDI = "hibernate";
public static final String URL =
"t3://localhost:7001";
private static final Logger log = Logger.getLogger(WLSStartup.class);

public void setServices(T3ServicesDef services) {}

public String startup(String name, Hashtable args) throws Exception {
String METHOD_NAME =
"startup ";
try {
log.info(METHOD_NAME +
" Going to bind Hibernate object. ");
doBind( );
log.info (METHOD_NAME +
" Bound Hibernate object!");
} catch (Exception e) {
log.info (METHOD_NAME +
" Exception while binding Hibernate Object to Weblogic JNDI" );
e.printStackTrace( );
}
return
"WLS Startup completed successfully";
}

private static void doBind( ) throws Exception {
Properties environment = null;
InitialContext context = null;

try {
environment = new Properties( );
environment.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
environment.put(Context.PROVIDER_URL,URL);
log.info(
"Constructing an Initial Directory Context object" );
context = new InitialContext( environment );

Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();
if (sf == null) throw new Exception(
"SessionFactory cannot be built!");

try {
if(context.lookup(SESSION_FACTORY_JNDI ) != null )
context.rebind(SESSION_FACTORY_JNDI, sf);
else
context.bind(SESSION_FACTORY_JNDI, sf);
} catch (NamingException nameEx ) {
context.bind(SESSION_FACTORY_JNDI, sf);
}

} catch ( NamingException nameExp ) {
throw new Exception(
"NamingException: " + nameExp.getMessage());
} catch( Exception excp ) {
throw excp;
} finally {
if(context != null) {
try {
context.close( );
context = null;
} catch ( NamingException nameExp ) {
throw new Exception(
"NamingException for context close: " + nameExp.getMessage());
}
}
environment = null;
}
}
}


编译这个源代码的时候需要注意的是,要把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.fankai.WLSStartup,然后点击“Apply”。然后切换到Target这选项卡,在Target-Server左边的Avaiable框里面选择“myserver”,点击右箭头,把它挪到右边的“Chosen”框里面去,最后再点击一下“Apply"按钮。如果此时Weblogic的DOS窗口里面没有出错信息,那么应该已经配置成功了。

六、现在关闭Weblogic,再重新运行startWelogic.cmd,启动Weblogic,观察DOS窗口的输出信息,可以看到Hibernate的初始化信息一屏屏的滚动输出,证明已经配置成功。现在再打开Console控制台,点击左边Applet树中的Servers|myserver,然后可以在右边最下面找到“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");



uu_snow

悄悄话
发表文章: 55
注册时间: 2002年11月29日 10:52
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 14:52 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
在WebSphere下怎么配置呢?
muziq

悄悄话
发表文章: 31
注册时间: 2003年07月25日 14:51
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 18:20 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
>
> Configuration conf = new
> = new Configuration().addClass(Cat.class);


这里,是不是系统里有多少Persistant Class,都必须在这里全部加进来呢?
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 19:00 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
对。或者写到Hibernate.cfg.xml里面也可以。
SunOne

悄悄话
发表文章: 21
注册时间: 2003年06月12日 21:14
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 20:42 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Hibernate的文档上说Hibernate的JNDI在JBoss、WebSphere、Orion、Resin等服务器上能够很好的工作,这是不是说在这些服务器上不需要另外配置JNDI,而依靠Hibernate自己的bind.
我想是不是因为这些服务器的JNDI实现是可写的,所以可以在运行期动态绑定,而Tomcat等的JNDI是只读的,所以Hibernate的bind不起作用
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 21:19 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
是这样的,在Weblogic上确实可以不需要像上面那种做法自己写程序来进行绑定,也可以由Hibernate自己在运行期进行动态绑定。但是如果使用Hibernate自己的运行期绑定的话,有一个悖论,就是只有在Hibernate被初次调用进行初始化的时候,才会将SessionFactory的实例绑定到JNDI上去,那么意味着,在首次调用Hibernate之前,JNDI上是没有SessionFactory实例的,所以你必须在所有的其它程序通过JNDI获得SessionFactory实例之前,运行某个程序对Hibernate进行初始化,把SessionFactory实例绑定到JNDI上。如果是纯Servlet/JSP应用的话,可以配置一个load-up=1的servlet进行Hibernate的初始化,如果是混合EJB,Servlet/JSP的应用,就无法保证在程序被调用前对Hibernate进行初始化,因此对于Weblogic来说,最保险的解决办法就是建立一个StartUp类,确保Weblogic一启动,就对Hibernate进行初始化。
xinxin2

悄悄话
发表文章: 11
注册时间: 2003年08月19日 21:06
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 21:31 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
是啊o 有]有人f一f在WebSphere下怎么配置呢?

xx
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 22:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我看了一下Hibernate2.0.1的源代码,Hibernate的JNDI名称绑定是在net.sf.hibernate.impl.SessionFactoryObjectFactory程序里面实现的,这下就很清楚了,我来分析一下Hibernate的绑定JNDI的过程:
我们获得SessionFactory一般是这样写代码:

Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();

首先是new Configuration()创建一个Configuration,在这个构造器里面进行配置文件(hibernate.properties)的读取工作,然后保存到一个Properties对象里面去,和JNDI相关的是这个属性:

hibernate.session_factory_name Hibernate/session_factory

接着调用buildSessionFactory()方法,该方法检查一下配置信息,然后调用SessionFactoryImpl的一个构造器。在构造器里面注意下面两行代码:

name = properties.getProperty(Environment.SESSION_FACTORY_NAME);
SessionFactoryObjectFactory.addInstance(uuid, name, this, properties);

调用了SessionFactoryObjectFactory的addInstance方法,并且把自身(SessionFactory的实例)作为参数传递。最后在addInstance方法可以看到如下代码:

Context ctx = NamingHelper.getInitialContext(properties);
NamingHelper.bind(ctx, name, instance);

instance就是SessionFactory的实例,通过读源代码,可以清楚的看到Hibernate是在conf.buildSessionFactory()的时候通过一系列类方法调用,把创建的SessionFactory实例绑定到配置文件(hibernate.properties)中Hibernate.session_factory_name属性指定的名称上的,因此可见Hibernate自身是具有JNDI的动态绑定功能的。但是Hibernate需要获得一个SessionFactory实例用于绑定,而这个SessionFactory实例需要我们写代码进行预先创建,并且必须保证该过程要在所有其它要从JNDI上获得SessionFactory实例的程序之前完成。

因此对于任何App Server来说,我们都不必去管JNDI名称的绑定过程,只需要保证预先创建一个SessionFactory实例出来就够了,剩下的工作Hibernate会做的。那么如何确保预创建SessionFactory实例呢,如果是Servlet,可以配置一个初始化的Servlet,只要把

Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();

这样的代码加进去就可以了。如果是包含EJB的的复杂的J2EE应用,可能需要依靠App Server的功能来保证预创建SessionFactory实例。






robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 22:29 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
根据上面的分析结果,我们可以把Hibernate的JNDI配置过程进行简化,不必自己写代码进行JNDI的绑定过程,而是利用Hibernate自身进行JNDI的动态绑定,还是以Weblogic来说明:

1、把Hibernate的jar包,配置文件,相关类路径加入到Weblogic的CLASSPATH中去(参考楼顶贴)

2、配置Hibernate.properites,以下几行是必须配置的:

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

前3行上面帖子已经提到了,注意最后一行,这是使用Hibernate来绑定JNDI给JNDI起的名称,本来应该是Hibernate/session_factory,但是Weblogic要求改为.号,不过在程序中lookup的时候还是要写Hibernate/session_factory。

3、为了保证SessionFactory实例的预创建,使用Weblogic的T3StartUpDef接口创建一个StartUp类,在Weblogic启动的时候运行:

package com.fankai;

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 {
Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();
return "Hibernate Startup completed successfully";
}
}

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

Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();

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

4、编译HibernateStartUp.java,然后启动Weblogic,把com.fankai.HibernateStartUp在Console控制配置好。

5、重新启动Weblogic,已经可以在DOS窗口看到Hibernate的初始化信息了,在Consle中查看JNDI树,可以看到Hibernate路径下的session_factory

总结:
在其它App Server上如何配置,本质上和Weblogic是一样的,只是你要确保在其它程序运行之前,先把

Configuration conf = new Configuration().addClass(Cat.class);
SessionFactory sf = conf.buildSessionFactory();

这两行代码运行一遍就OK了,聪明的你要是再说不知道怎么在Websphere上配置Hibernate的JNDI,我也只好无言了。


robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月25日 22:46 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
在上面的例子中,由于在Hibernate.properties中指定JNDI名称为:

hibernate.session_factory_name Hibernate.session_factory

所以JNDI路径为Hibernate/session_factory (在Weblogic中,配置文件中的JNDI路径不能写成/,要写成.)

然后在程序中调用JNDI,获得SessionFactory实例的代码为:

Context ctx = new InitialContext();
SessionFactory sf = (SessionFactory) ctx.lookup("hibernate/session_factory");



xinxin2

悄悄话
发表文章: 11
注册时间: 2003年08月19日 21:06
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年08月26日 02:19 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Thanks Robbin!

I am kind of getting to know this, and I tried it with websphere, it seems like working properly. You are the right person!
getup

悄悄话
发表文章: 2
注册时间: 2003年10月03日 18:19
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年10月03日 18:23 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我在启动Weblogic的时候,出了如下的错,哪里配置有问题啊?
<2003-10-3 下午06时30分38秒> <Info> <WebLogicServer> <000287> <Invoking startup
class: HibernateStartup.startup(null)>
java.lang.ExceptionInInitializerError: org.apache.commons.logging.LogConfigurati
onException: java.lang.reflect.InvocationTargetException
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactory
Impl.java:532)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactory
Impl.java:272)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactory
Impl.java:246)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:395)
at net.sf.hibernate.cfg.Configuration.<clinit>(Configuration.java:86)
at HibernateStartup.doBind(HibernateStartup.java:47)
at HibernateStartup.startup(HibernateStartup.java:22)
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年10月04日 18:02 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
你没有正确配置log4j。
getup

悄悄话
发表文章: 2
注册时间: 2003年10月03日 18:19
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年10月08日 17:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Robbin,我不太清楚Hibernate的环境里面需要对Log4J进行什么配置,有什么讲究吗?不宁赐教。谢谢
robbin

悄悄话
发表文章: 590
注册时间: 2003年06月18日 09:32
Re: 将Hibernate配置到Weblogic JNDI上的详细步骤 2003年10月09日 03:17 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
没有什么讲究,下载log4j,放到CLASSPATH里面就可以了,我顶楼的帖子里面CLASSPTH里面就配置了log4j了。

hibernate里面src目录下有一个log4j的配置文件的例子,拿过来直接用。
这个主题有 26 回复 / 2Go 1 2
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam