Je développais une application utilisant Spring JPA et Spring JDBC, et je me demandais s'il y avait une différence dans le moment de la création du pool de connexions DB. JPA semble d'abord sécuriser la connexion car une exception se produira si les informations de connexion sont incorrectes ou si le serveur de base de données n'est pas accessible au démarrage de l'application. D'autre part, JDBC démarrera l'application même s'il ne peut pas se connecter à la base de données. J'obtiens une exception lors de l'accès à la base de données et remarque le problème. Je suis juste convaincu que le pool de connexions est créé au démarrage de l'application, donc je n'étais pas convaincu par le comportement de JDBC. En fait, je craignais que le pool de connexions n'ait été créé dans JDBC en raison de paramètres incorrects, j'ai donc décidé de le vérifier.
Au moment suivant, vérifiez le nombre de connexions à la base de données pour déterminer si un pool de connexions a été créé.
Depuis que j'ai utilisé postgreSQL pour la base de données, vérifiez le nombre de connexions avec la commande suivante.
sample=# select count(*) from pg_stat_activity;
Le nombre de connexions avant et après le démarrage de l'application est le même et le nombre de connexions a augmenté de 10 après l'accès à la base de données. Ma conviction que "les pools de connexions sont créés au démarrage de l'application" était fausse.
--Avant de lancer l'application
sample=# select count(*) from pg_stat_activity;
count
-------
2
(1 row)
--Après le lancement de l'application
sample=# select count(*) from pg_stat_activity;
count
-------
2
(1 row)
--Après l'accès à la base de données
sample=# select count(*) from pg_stat_activity;
count
-------
12
(1 row)
Créez une application Web à l'aide de Spring Initializer. Dans Controller, JDBC fait référence à la base de données.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
</dependencies>
application.properties
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/sample
spring.datasource.username=admin
spring.datasource.password=admin
spring.datasource.sql-script-encoding=UTF-8
package com.example.jdbc.entity;
import lombok.Data;
@Data
public class Users {
private String username;
private String encodedPassword;
private Boolean systemUserFlag;
private Boolean adminUserFlag;
}
package com.example.jdbc.repository;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.stereotype.Component;
import com.example.jdbc.entity.Users;
@Component
public class UsersRepository {
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Autowired
public UsersRepository(DataSource dataSource) {
namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public List<Users> searchAll() {
List<String> sqlLines = new ArrayList<>();
sqlLines.add("SELECT username, encoded_password, system_user_flag, admin_user_flag FROM universe.users");
String sql = String.join(" ", sqlLines);
MapSqlParameterSource paramMap = new MapSqlParameterSource();
namedParameterJdbcTemplate.queryForRowSet(sql, paramMap);
SqlRowSet ret = namedParameterJdbcTemplate.queryForRowSet(sql, paramMap);
List<Users> list = new ArrayList<>();
while (ret.next()) {
Users users = new Users();
users.setUsername(ret.getString("username"));
users.setEncodedPassword(ret.getString("encoded_password"));
users.setSystemUserFlag(ret.getBoolean("system_user_flag"));
users.setAdminUserFlag(ret.getBoolean("admin_user_flag"));
list.add(users);
}
return list;
}
}
package com.example.jdbc.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.example.jdbc.entity.Users;
import com.example.jdbc.repository.UsersRepository;
@Controller
@RequestMapping("sample")
public class SampleController {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private UsersRepository userRepository;
@RequestMapping(value = "")
public ModelAndView index(@RequestParam String name, ModelAndView mov) {
List<Users> usersList = userRepository.searchAll();
logger.info(usersList.toString());
mov.addObject("name", name);
mov.setViewName("/sample/index");
return mov;
}
}
src/main/resources/templates/sample/index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Sample</title>
</head>
<body>
<div th:text="${'Hello,' + name}"></div>
</body>
</html>
```
References
+ [Vérifiez le nombre actuel de connexions avec Postgres](http://adempiere-devnote-jpn.blogspot.com/2017/07/postgres-checkconnections.html)