Weblogic事务管理:weblogic.transaction.internal.AppSetRollbackOnlyException:在事务上调用setRollbackOnly

时间:2018-11-17 11:11:36

标签: java spring hibernate spring-boot spring-data-jpa

我觉得WebLogic数据源有一个特定的问题。我有一个包含3个服务器的群集。其中2个(称为后端服务器)分别运行EJB工件(不同的),而第3个是使用这些工件的EJB工件。所有这三个都在同一台计算机上运行。

有2个数据源,每个数据源都针对2个后端服务器之一,它们的设置基本相同,并使用不同的用户和不同的数据库连接到同一数据库服务器(PostgreSQL)。

在每个后端服务器上,我将Hibernate 5.3.7与JPA 2.2一起使用。在两台服务器上,工件均已成功部署。在将休眠ddl设置为update的情况下,我看到在两个数据库中,实体表均已成功创建,并且没有看到任何错误。日志文件。我在两个工件上都使用了Spring Data JPA。

这2个EJB工件之间的主要区别在于,其中一个(我有一个问题)将Spring Data Redis与Spring Data JPA一起使用。这样一来,我就无法信任Spring为我实例化存储库,即使是JPA也是如此(afaik spring-data-redis不提供存储库的实现)。我创建了一个生产者,为我做到了:

public class RepositoryConfiguration {

    @Inject
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public UserRepository userRepository() {
        return createRepository(UserRepository.class);
    }

    private <T extends Repository> T createRepository(Class<T> repositoryClass) {
        RepositoryFactorySupport factory = new JpaRepositoryFactory(entityManager);
        return factory.getRepository(repositoryClass);
    }
}

据我所知,redis存储库甚至没有被触及,因此实现应该不会造成任何问题。

我遇到的实际问题是,每当我尝试从UserRepository读取数据时,都会出现异常:

java.sql.SQLException: Transaction BEA1-0002E54B992150673EDF not active anymore. tx status = Marked rollback. [Reason=weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction]
        at weblogic.jdbc.jts.Driver.getTransaction(Driver.java:560) ~[com.bea.core.datasource6.jar:12.2.1.3]
        at weblogic.jdbc.jts.Driver.connect(Driver.java:114) ~[com.bea.core.datasource6.jar:12.2.1.3]
        at weblogic.jdbc.common.internal.RmiDataSource.getConnectionInternal(RmiDataSource.java:638) ~[com.bea.core.datasource6.jar:12.2.1.3]
        at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:594) ~[com.bea.core.datasource6.jar:12.2.1.3]
        at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:587) ~[com.bea.core.datasource6.jar:12.2.1.3]
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[org.hibernate-hibernate-core-5.3.7.Final.jar:5.3.7.Final]
        at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) ~[org.hibernate-hibernate-core-5.3.7.Final.jar:5.3.7.Final]
        at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:106) ~[org.hibernate-hibernate-core-5.3.7.Final.jar:5.3.7.Final]

我有一个实例化EntityManager的bean:

@PersistenceContext(name = "UsersDS")
private EntityManager em;

@Produces
@RequestScoped
public EntityManager getEntityManager() {
    log.trace("EntityManager requested");
    return em;
}

正在产生异常的代码是:

@Slf4j
@Stateless(name = "AuthenticationService")
public class AuthenticationServiceImpl implements AuthenticationService {

    @Inject
    private AuthenticationRepository authenticationRepository;

    @Inject
    private UserRepository userRepository;

    @Inject
    public AuthenticationServiceImpl() {
    }

    // ....

    @Override
    @Transactional
    public TokenState getTokenState(AuthenticationToken token) {
        log.trace("Searching {} in the userRepository", token);
        Optional<UserEntity> user = userRepository.findByUsername(token.getPrincipal())
                .filter(userEntity -> userEntity.getPassword().equals(token.getCredentials()));
        if (!user.isPresent()) {
            authenticationRepository.delete(token);
            return TokenState.INVALID;
        }

        switch (user.get().getState()) {
            case ACTIVE:
                return authenticationRepository.existsById(token.getSessionId()) ?
                        TokenState.AUTHENTICATED : TokenState.UNAUTHENTICATED;
            case LOCKED:
                return TokenState.LOCKED;
            case INACTIVE:
                return TokenState.DISABLED;

            default:
                return TokenState.INVALID;
        }
    }
}

我有集成测试,该测试运行内存中的H2数据库和嵌入式Redis数据库,并带有手动管理的EntityManager,运行起来没有任何问题。

有人可以给我有关如何解决此问题的提示吗?

0 个答案:

没有答案