[JAVA] Wenn das JDBC-Verbindungspooling erstellt wird

Einführung

Ich habe eine App mit Spring JPA und Spring JDBC entwickelt und mich gefragt, ob es einen Unterschied im Zeitpunkt der Erstellung des DB-Verbindungspools gibt. JPA scheint die Verbindung zuerst zu sichern, da eine Ausnahme auftritt, wenn die Verbindungsinformationen falsch sind oder beim Starten der Anwendung nicht auf den DB-Server zugegriffen werden kann. Auf der anderen Seite startet JDBC die App, auch wenn keine Verbindung zur Datenbank hergestellt werden kann. Ich erhalte eine Ausnahme beim Zugriff auf die Datenbank und bemerke das Problem. Ich bin nur davon überzeugt, dass der Verbindungspool beim Start der App erstellt wird, daher war ich vom Verhalten von JDBC nicht überzeugt. Eigentlich war ich besorgt, dass der Verbindungspool aufgrund falscher Einstellungen nicht in JDBC erstellt wurde, und habe mich daher entschlossen, ihn zu überprüfen.

Überprüfungsmethode

Überprüfen Sie beim nächsten Zeitpunkt die Anzahl der DB-Verbindungen, um festzustellen, ob ein Verbindungspool erstellt wurde.

Da ich postgreSQL für die Datenbank verwendet habe, überprüfen Sie die Anzahl der Verbindungen mit dem folgenden Befehl.

sample=# select count(*) from pg_stat_activity;

Prüfergebnis

Die Anzahl der Verbindungen vor und nach dem Start der Anwendung ist gleich, und die Anzahl der Verbindungen hat sich nach dem Zugriff auf die Datenbank um 10 erhöht. Meine Überzeugung, dass "Verbindungspools beim Start der App erstellt werden", war falsch.

--Vor dem Start der App
sample=# select count(*) from pg_stat_activity;
 count 
-------
     2
(1 row)

--Nach dem Start der App
sample=# select count(*) from pg_stat_activity;
 count 
-------
     2
(1 row)

--Nach dem DB-Zugriff
sample=# select count(*) from pg_stat_activity;
 count 
-------
    12
(1 row)

Überprüfungsprogramm

Erstellen Sie eine Web-App mit Spring Initializer. In Controller verweist JDBC auf die Datenbank.

pom.xml (Auszug aus der Abhängigkeit)

	<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

Entitätsklasse

package com.example.jdbc.entity;

import lombok.Data;

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

DAO-Klasse


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

Controller-Klasse

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

 + [Überprüfen Sie die aktuelle Anzahl der Verbindungen mit Postgres](http://adempiere-devnote-jpn.blogspot.com/2017/07/postgres-checkconnections.html)




Recommended Posts

Wenn das JDBC-Verbindungspooling erstellt wird
Ich möchte eine Verbindung herstellen, wenn eine Datenbank mit Spring und MyBatis erstellt wird
Wenn SimpleDateFormat wie ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧ verstümmelt ist