私はHibernateとHikari DataSourceを持つSpringブートプロジェクトを持っています。私はセッションオブジェクトを取得するために注入されたSessionFactoryのオブジェクトを持ついくつかの機能を持っている場合は は、数日中に、私は(だけ解きにこの問題を再起動する)DB操作でassosiated任意のメソッドのような例外があります。JDBC接続を取得できません
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.
それはマニュアルに使用されるセッションに思えますこの問題を引き起こします。 (私は同じのconfigsと機能と同様のプロジェクトを持っていますが、SessionFactoryのとセッションを注入せずに...と私は全くこのような問題はありません)
application.yaml:
spring:
jpa:
properties:
hibernate:
dialect : org.hibernate.dialect.PostgreSQLDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
をDataSourceConfig
@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();
}
}
LogRepositoryImpl
@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();
}
}
dataSource.setMaximumPoolSize(30)、 dataSource.setMinimumIdle();この問題は解決しませんでした
最初の操作では機能しますが、選択/保存に成功した後にタイムアウトしますか? –
はい、初めてアプリケーションを起動したときは、すべて正常です。 –