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

目前发现一个问题:
容器管理的有状态会话bean。
当连接池最大连接个数设置成1的时候会有一个有趣的现象发生,如果一个事务没有执行完,另外一个事务就会发生无法获取DB连接的错误。
是不是jboss的事务处理是必须在事务提交以后他所占用的DB Connection才会被释放呢?

期待各位帮忙。

事务都是这样的,JDBC事务当然是占用一个连接了。

re banq:
JDBC事务必须在一个connection里面我是知道的,但是现在出问题的是容器管理的Java事务。
Java事务应该是跨连接,跨资源的才对啊。
而且代码里有明显的con.close(),现象上来说就是jboss的事务接管了连接的关闭和commit(感觉上应该是dataSource接管才对),真实的原因是什么?到哪儿去找相关的代码?失去看jboss的事务实现吗?

看了一下相关的信息,发现讲事务的开头都是一句话:事务接管DB连接,具体怎么实现没有讲。
banq的意思是不是说:Java事务的底层实现是封装了的jdbc事务?

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

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

请大家支持。

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

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

>>当连接池最大连接个数设置成1的时候会有一个有趣的现象发生,如果一个事务没有执行完,另外一个事务就会发生无法获取DB连接的错误
楼主最大连接数设置为1;当然在一个事务完成前是一直占用此连接的(JDBC事务),你可以增加连接池数量,也可以设置连接的时间等参数.

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

因为之前的代码里看到了con.close(),然后在连接池的实现代码里应该是释放这个连接可以给其他使用的,但是如果连接真的被其他程序使用了,jdbc事务肯定是无法保证的。
从这个方面我想应该是JTA接管了连接的关闭和commit。但是还没有找到具体的相关的实现。

找到后就发上来了。