Tips of hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1

原创 2005年05月16日 12:42:00

Tips of  hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1

bromon原创 请尊重版权

 

       最近的工作都是在webligc 8.1 + hibernate的平台上做开发,涉及的数据库是oracle 9.2db2 8.1。对于这两个数据库我的了解都远远不够,所以开发中遇到很多问题,还好问题都解决了,很感谢阿古。有的问题也许大家都会遇到,列出我的解决办法,供大家参考。

 

一、weblogic 8.1下的数据库连接池配置

 

weblogic 8.1下配置连接池是很容易的,通过console全鼠标操作。以前我做过很多次了,驾轻就熟,很快搞定。编写好pojohbmtest一下,结果抛出了一个SQLException,具体信息我没有记录,大概意思是说:“事务没有被提交,因为它处于一个分布式事务中,当分布式事务结束后它会被提交。”打开oracle,确实没有看到测试数据,整个环境中我没有使用JTA,也不存在分布式数据库。Google了一下,看见别人的建议有:

 

1、              选择jdbc驱动的时候,不要使用xa系列驱动。这个其实大家都知道,xa系列驱动是为JTA准备的,我在配置连接池的时候也确实没有选择这类驱动。排除。

2、              修改startWeblogic.cmd,不要启动pointbase。查看startWeblogic.cmd后没有发现有启动pointbase的迹象,在端口列表中也没有发现。排除。

 

后来找到的解决办法是,配置webloigcdata source时,有这么一个选项:

 

Honor Global Transactions

 

它的相关说明是:

 

Specifies whether this data source will participate in existing global (XA) transactions. Unchecking this option while creating the data source should be done rarely and with care. This option can not be changed once the data source is created.

 

       就是它了,把它去掉,try againpassed

      

       上述问题在oracledb2中都存在。

 

二、时间字段的处理

 

开发过程中涉及到了时间的存储和查询,相关的处理要依靠oracledb2自己的函数,有小小区别。

 

一个hibernate中对oracle进行时间查询的例子:

from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=to_date('"+start+"','yyyy-MM-dd HH:mi:ss') and ti.taskEndTime<=to_date('"+end+"','yyyy-MM-dd HH:mi:ss')";

 

       其中的startend变量为java.util.Date()。使用了oracleto_date函数来做日期转换,很多java程序员也许会和我一样,直觉的采用”yyyy-MM-dd HH:mm:ss”的格式作为时间的正则表达式,但是在oracle中会引起错误:”ORA 01810 格式代码出现两次。原因是sql中不区分大小写,MMmm被认为是相同的格式代码,所以oraclesql采用了mi代替分钟。

 

       DB2中的查询语句是:

from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=timestamp('"+s+"')  and ti.taskEndTime<=timestamp('"+e+"')";

 

       DB2中的函数是timestamp,无须指定时间格式。

 

三、Hibernatelazy loading

 

Lazy loading是进行集合映射时很有用处的优化选项,但是使用起来容易遇到问题。比如在我们的应用中,user->post形成一对多的映射,User中有一个包含postList。同时系统采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

 

回到我们的例子,在User中,有多个属性:namepasswordphone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。

 

解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装,郁闷。

 

后来采用所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个sessionresponse结束之后再关闭它,这样可以让session存在于整个请求周期中。但是在实际操作过程中,发现一下问题:

 

Lazy laoding应该是两条select构成的,但是在使用了OpenSessionInView模式后,系统执行了一条selectsession就被关闭了。相同的代码,放到普通环境中,就执行正常,目前这个问题已经在java eye挂了很久,无人解答。望高人指点。

在Linux 上安装DB2 8.1 并配置windows 客户端连接

第一次在linux上安装DB2,参考了很多的网上资源,但是主要的是“Linux下安装DB2 version 8.1 的详细步骤”。同时把自己遇到的问题住了一个记录,以做学习之用。VMWARE使用的是V...

db2 v8.1的许可证文件

  • 2009年12月04日 15:45
  • 1KB
  • 下载

IBM DB2 UDB V8.1 基础教程

  • 2010年01月12日 16:15
  • 16.44MB
  • 下载

weblogic 的应用 常见问题处理 db2 链接不上

xingkaistart   weblogic10之Failed to initialize the application 'wss-1-1' due to error weblogic...

db2 V8.1 license [有效]

  • 2010年12月08日 15:37
  • 1KB
  • 下载

DB2 V8.1 license 永不过期

  • 2008年11月01日 15:51
  • 899B
  • 下载

weblogic10.3配置自定义的DB2驱动

文章主要内容:在windows操作系统中,使用weblogic10.3服务器,使用com.ibm.db2.jcc.DB2Driver驱动来配置db2数据源。 在使用weblogic自带的db2驱动we...

weblogic 8.1 + oracle 9i平台升级教程

  • 2008年08月05日 17:24
  • 2.98MB
  • 下载

weblogic8.1实战指南.part2.rar

  • 2008年04月03日 14:28
  • 16KB
  • 下载

win8.1 oracle 11g R2 安装手顺

一、Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。 路径名称中,最好不要出现中文,也不要出现空格等不规则字符。 官方下地址: http://www...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tips of hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1
举报原因:
原因补充:

(最多只允许输入30个字)