L'impossibilité d'acquérir la Connexion JDBC
J'ai un Ressort de Démarrage du projet avec mise en veille prolongée et Hikari de la source de données.
Si j'ai quelques fonctionnalités injection de SessionFactory objet pour obtenir l'objet de session, dans quelques jours, j'ai une telle exception pour toutes les méthodes assosiated avec db opérations (uniquement le redémarrage résout ce problème):
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.
Il semble manuel de session utilisée rend ce problème. (J'ai même projet avec le même configs et la fonctionnalité, mais sans injecté SessionFactory et de la Session...et je n'ai pas de problème à tous)
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();
}
}
source de données.setMaximumPoolSize(30),
source de données.setMinimumIdle(); n'a pas de résoudre ce problème
- Cela fonctionne pour les opérations initiales, mais alors commencer à chronométrer après quelques succès, sélectionne/sauve?
- Oui, la première fois après le lancement de l'application, tout va bien.
Vous devez vous connecter pour publier un commentaire.
Me semble être un problème avec votre transaction limites, qui ne sont pas libérer les connexions de retour à la piscine. Pourriez-vous essayer de mettre
@Transactional
sur votreLogRepositoryImpl
classe?