我觉得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,运行起来没有任何问题。
有人可以给我有关如何解决此问题的提示吗?