hibernate JNDI查询挂死WebSphere

[b]运行环境:[/b]
Aix + WebSphere 6.1 + Oracle + Quartz1.65 + Sping2.5.6 +Hibernate 3.3.1
[b]现象:[/b]
WebSphere 的Node & Server挂死,JVM堆栈溢出,WebSphere 所在分区被JVM core dump 文件塞满
[b]原因:[/b]
Quartz 管理的线程运行在非容器托管状态(不受WebSphere控制),获取不到J2EE context,并且线程中使用到了Hibernete,在试图通过java:comp/UserTransaction查询JTA时throw NamingException,而Hibernete JTATransactionFactory.java 如下代码存在BUG:
	protected UserTransaction getUserTransaction() {
log.trace( "Attempting to locate UserTransaction via JNDI [{}]", getUserTransactionName() );

try {
UserTransaction ut = ( UserTransaction ) getInitialContext().lookup( getUserTransactionName() );
if ( ut == null ) {
throw new TransactionException( "Naming service lookup for UserTransaction returned null [" + getUserTransactionName() +"]" );
}

log.trace( "Obtained UserTransaction" );

return ut;
}
catch ( NamingException ne ) {
throw new TransactionException( "Could not find UserTransaction in JNDI [" + getUserTransaction() + "]", ne );
}
}

,其中[color=red]throw new TransactionException( "Could not find UserTransaction in JNDI [" + getUserTransaction() + "]"[/color] ,按作者的意思应该是getUserTransactionName() 误写成了getUserTransaction() 导致无限递归调用

[b]解决办法 :[/b]
[b]方案1:[/b]
重写JTATransactionFactory.java 的getUserTransaction() 方法
代码如下
protected UserTransaction getUserTransaction() {
log.trace( "Attempting to locate UserTransaction via JNDI [{}]", getUserTransactionName() );
if(uTran != null)
return uTran;
try {
uTran = ( UserTransaction ) getInitialContext().lookup( getUserTransactionName() );
if ( uTran == null ) {
uTran = ( UserTransaction ) getInitialContext().lookup( CLIENT_USER_TRANSACTION_NAME );
if(uTran != null)
return uTran;
else
throw new TransactionException( "Naming service lookup for UserTransaction returned null [" + getUserTransactionName() +"]" );
}

log.trace( "Obtained UserTransaction" );

return uTran;
}
catch ( NamingException ne ) {
try {
uTran = ( UserTransaction ) getInitialContext().lookup( CLIENT_USER_TRANSACTION_NAME );
} catch (NamingException e) {
e.printStackTrace();
}
if(uTran != null)
return uTran;
else
throw new TransactionException( "Could not find UserTransaction in JNDI [" + getUserTransactionName() + "]", ne );
}
}


其中CLIENT_USER_TRANSACTION_NAME= [color=blue]"jta/usertransaction"[/color]

[b]方案2:[/b]
自定义hibernate.transaction.factory_class类
使用Spring注入usertransaction
重载getUserTransaction
 protected UserTransaction getUserTransaction() {
return userTransaction;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值