请教有状态会话bean事务属性是require时,DB连接什么时候释放

07-01-15 chabulier
目前发现一个问题:

容器管理的有状态会话bean。

当连接池最大连接个数设置成1的时候会有一个有趣的现象发生,如果一个事务没有执行完,另外一个事务就会发生无法获取DB连接的错误。

是不是jboss的事务处理是必须在事务提交以后他所占用的DB Connection才会被释放呢?

期待各位帮忙。

banq
2007-01-15 17:53
事务都是这样的,JDBC事务当然是占用一个连接了。

chabulier
2007-01-15 19:11
re banq:

JDBC事务必须在一个connection里面我是知道的,但是现在出问题的是容器管理的Java事务。

Java事务应该是跨连接,跨资源的才对啊。

而且代码里有明显的con.close(),现象上来说就是jboss的事务接管了连接的关闭和commit(感觉上应该是dataSource接管才对),真实的原因是什么?到哪儿去找相关的代码?失去看jboss的事务实现吗?

chabulier
2007-01-16 14:28
看了一下相关的信息,发现讲事务的开头都是一句话:事务接管DB连接,具体怎么实现没有讲。

banq的意思是不是说:Java事务的底层实现是封装了的jdbc事务?

如果是这样的话,那么跨越多个资源的事务是怎么实现的呢?

期待达人能够早日解惑,或者告诉我到哪儿去找资料。

chabulier
2007-01-24 12:32
请大家支持。

banq
2007-01-30 11:25
>事务接管DB连接

JTA方面去研究,使用JTA事务,一般需要通过JNDI从容器获得Datasource,这样才能实现JTA事务接管DB连接。

跨数据库事务可研究2PC,也就是两段事务,其实原理简单,使用很方便,这些JBoss都提供oracle-xa-ds.xml这类配置来实现,程序中只要通过显示或隐式调用(配置)即可。

leoyu
2007-02-02 09:57
>>当连接池最大连接个数设置成1的时候会有一个有趣的现象发生,如果一个事务没有执行完,另外一个事务就会发生无法获取DB连接的错误

楼主最大连接数设置为1;当然在一个事务完成前是一直占用此连接的(JDBC事务),你可以增加连接池数量,也可以设置连接的时间等参数.

chabulier
2007-02-02 12:33
感谢banq和leoyu

JDBC事务占用连接我是知道的,但是JTA怎么样接管了JDBC事务,还没有弄明白?这个应该是容器实现的相关功能吧,我想应该看看jboss的事务实现代码。

因为之前的代码里看到了con.close(),然后在连接池的实现代码里应该是释放这个连接可以给其他使用的,但是如果连接真的被其他程序使用了,jdbc事务肯定是无法保证的。

从这个方面我想应该是JTA接管了连接的关闭和commit。但是还没有找到具体的相关的实现。

找到后就发上来了。

猜你喜欢