JBoss AS 7数据源配置 - 事务未激活

时间:2011-12-28 14:07:44

标签: java cdi jboss7.x

我在standalone.xml中的JBOSS AS 7上有这个数据源配置:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jndi-name="java:jboss/MyJndiDS" pool-name="MyPoolDS" enabled="true" jta="true" use-java-context="false" use-ccm="true">
                    <connection-url>
                        jdbc:postgresql://192.168.2.125:5432/t_report
                    </connection-url>
                    <driver>
                        org.postgresql
                    </driver>
                    <transaction-isolation>
                        TRANSACTION_READ_COMMITTED
                    </transaction-isolation>
                    <pool>
                        <min-pool-size>
                            3
                        </min-pool-size>
                        <max-pool-size>
                            7
                        </max-pool-size>
                        <prefill>
                            true
                        </prefill>
                        <use-strict-min>
                            false
                        </use-strict-min>
                        <flush-strategy>
                            FailingConnectionOnly
                        </flush-strategy>
                    </pool>
                    <security>
                        <user-name>
                            my_user
                        </user-name>
                        <password>
                            my_pass
                        </password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>
                            32
                        </prepared-statement-cache-size>
                    </statement>
                </datasource>
...
...
            </datasources>
</subsystem>

当我下次尝试登录时,我和同一个用户登录并注销7次时出现Transaction not active错误。我怎样才能解决这个问题?我不想增加max-pool-size。这是我的注销方法:

import javax.faces.context.ExternalContext;
@Inject ExternalContext ec;

public void validateUserLogOut() {

    HttpServletRequest request = (HttpServletRequest)ec.getRequest();
    request.getSession().invalidate();
    this.setUserLoggedIn(false);
    navigation.logout();

}

2 个答案:

答案 0 :(得分:1)

我认为你的问题不是数据源(这只是暴露它),而是登录模块似乎保持连接打开而不是将它们返回池中这一事实。

答案 1 :(得分:1)

由于user503413的请求,我承认我犯了一个耻辱的错误:我忘了在使用它之后关闭连接(connection.close())。如果你没有关闭你的连接,它将不会将它返回到池中,因为你已经限制并到达max-pool-size(在我的情况下为7),不会创建新的连接。所以这里的教训总是一定要关闭你的connections。同时关闭prepared statements,否则您将收到内存泄漏