J'utilise spring-boot dans mon application Web et j'utilise spring-jpa pour lire/écrire à partir de/dans ma base de données. Cela fonctionne très bien, mais je veux comprendre comment gérer les connexions à la base de données. Ci-dessous, la configuration de mes propriétés pour la base de données:
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
spring.datasource.username=user
spring.datasource.password=pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=500
J'ai défini le nombre maximal de connexions sur 500. Lorsqu'un utilisateur fait une demande sur mon application Spring, une connexion à une base de données lui est ouverte. Après avoir terminé la demande, spring jpa mettra-t-il fin à cette connexion? Si non, quand fermera-t-il les connexions inutilisées?
J'ai lu le document de référence Spring jpa de http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ . Mais il ne mentionne rien sur les connexions.
Lors de l'utilisation du regroupement de connexions de base de données, un appel à sqlconnection.close()
ne fermera pas nécessairement la connexion poids lourd à la base de données. La plupart du temps, elle libèrera simplement la connexion comme pouvant être réutilisée dans le pool. C'est pourquoi il est conseillé d'appeler dès que possible la close()
sur la connexion lors de l'utilisation d'un pool de connexions côté client.
Dans votre configuration, le pool contiendra un nombre maximal de 500 connexions (il serait également utile de configurer maxIdle
, minIdle
et minEvictableIdleTimeMillis
pour régler le nombre de connexions prêtes à l'emploi. utiliser les connexions et à quelle fréquence les libérer quand elles ne sont pas utilisées).
Encore un peu de doc ici
Vous avez déjà constaté que vous pouvez configurer ceci à partir de application.properties
Vous pouvez trouver toutes les propriétés possibles ici .
Notez que depuis Spring Boot 1.4, il existe des propriétés de source de données pour chaque fournisseur de source de données avec lesquelles Spring s'intègre, prématurément. Il y a spring.datasource.dbcp.*
, spring.datasource.Tomcat.*
etc. Voir 1.4 docs
Si cela ne suffit pas et que vous avez besoin de quelque chose de très spécifique, vous pouvez déclarer le bean source de données vous-même. Voici l'exemple avec la source de données Tomcat:
@Bean
public DataSource dataSource(){
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://localhost:3306/mysql");
p.setDriverClassName("com.mysql.jdbc.Driver");
p.setUsername("root");
p.setPassword("password");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
"org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer");
DataSource datasource = new DataSource();
datasource.setPoolProperties(p);
return datasource ;
}