JDBC 연결을 가져올 수 없습니다.
Hibernate와 Hikari Data Source를 사용한 Spring Boot 프로젝트가 있습니다.SessionFactory 개체를 삽입하여 SessionFactory 개체를 가져오는 기능이 있는 경우 며칠 안에 DB 작업과 관련된 메서드에 대한 예외가 발생합니다(재기동해야 이 문제가 해결됩니다).
org.springframework.transaction.CannotCreateTransactionException:
Could not open JPA EntityManager for transaction; nested exception is
javax.persistence.PersistenceException:
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection at
......
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 -
Connection is not available, request timed out after 30001ms.
수동 사용 세션이 이 문제를 일으키는 것 같습니다.(같은 설정 및 기능을 가진 유사한 프로젝트가 있지만 Session Factory 및 Session이 삽입되지 않은 경우...그런 문제는 전혀 없습니다)
application.syslogl:
spring:
jpa:
properties:
hibernate:
dialect : org.hibernate.dialect.PostgreSQLDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
Data Source Config
@EnableJpaRepositories("com.my.project.config")
@Configuration
public class DataSourceConfig {
@Inject
private AppProperties properties;
@Bean(name = "dataSource")
public DataSource dataSource() {
AppProperties.DatabaseProperties dbProps = properties.getDatabaseProperties();
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(org.postgresql.Driver.class.getName());
dataSource.setJdbcUrl(
dbProps.getProtocol().concat("://")
.concat(dbProps.getDbHost()).concat(":")
.concat(dbProps.getDbPort()).concat("/")
.concat(dbProps.getDbname())
);
dataSource.setUsername(dbProps.getUsername());
dataSource.setPassword(dbProps.getPassword());
dataSource.setMaximumPoolSize(30);
dataSource.setMinimumIdle(30);
return dataSource;
}
@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
return hemf.getSessionFactory();
}
}
Log Repository Impl
@Repository
public class LogRepositoryImpl implements LogRepository {
@Autowired
private SessionFactory sessionFactory;
@Override
public List<Log> getLogs(int offset, int count) {
Criteria criteria = getSession().createCriteria(Log.class);
return criteria.setFirstResult(offset).setMaxResults(count).list();
}
@Override
public void save(Log log) {
getSession().save(log);
}
private Session getSession() {
return sessionFactory.getCurrentSession();
}
}
data source.set Maximum Pool Size(30), data Source.set MinimumIdle(); 이 문제를 해결하지 못했습니다.
최근 이 문제가 발생했지만 Connection Pool Error 메시지는 대기 중이었습니다.
실제 문제는 더 많은 메시지를 수신하지 않는 서드파티제 시스템으로 인해 각 스레드가 차단된다는 것입니다.스레드가 이전에 HikariCP에서 Connection을 취득한 경우 연결은 풀로 돌아오지 않습니다.따라서 Pooling Connections만큼 많은 접속이 성공했습니다.
이 경우:선택한 도구(APM, VisualVM 등)를 사용하여 JVM에서 차단된 스레드 수를 검사하고 스레드 덤프를 사용하여 차단된 스레드가 중지되는 위치를 검사합니다.
풀장과의 연결이 해제되지 않는 거래 경계의 문제처럼 들리는데요.퍼팅 좀 해주시겠어요?@Transactional
에LogRepositoryImpl
수업?
@Repository
@Transactional
public class LogRepositoryImpl implements LogRepository {
. . .
}
언급URL : https://stackoverflow.com/questions/44417026/unable-to-acquire-jdbc-connection
'programing' 카테고리의 다른 글
패키지 Import 방법.typeScript에 json이 있나요? (0) | 2023.03.13 |
---|---|
워드프레스 페이지 및 버전 제어 (0) | 2023.03.13 |
공백 문자는 JSON에서 중요하지 않습니까? (0) | 2023.03.13 |
React Router 4에서 인증된 루트를 구현하려면 어떻게 해야 합니까? (0) | 2023.03.13 |
반응에서 여러 줄 텍스트 문자열을 렌더링하는 방법 (0) | 2023.03.13 |