[JAVA] Lors de la création du pool de connexions JDBC

introduction

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.

Méthode de vérification

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;

résultat de l'inspection

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)

Programme de vérification

Créez une application Web à l'aide de Spring Initializer. Dans Controller, JDBC fait référence à la base de données.

pom.xml (extrait de dépendance)

	<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

Classe d'entité

package com.example.jdbc.entity;

import lombok.Data;

@Data
public class Users {
	private String username;
	private String encodedPassword;
	private Boolean systemUserFlag;
	private Boolean adminUserFlag;
}

Classe DAO


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;
	}
}

Classe de contrôleur

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)




Recommended Posts

Lors de la création du pool de connexions JDBC
Je souhaite établir une connexion lorsqu'une base de données est créée à l'aide de Spring et MyBatis
Lorsque SimpleDateFormat est déformé comme ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧