← Назад к вопросам
Как происходит общение между Spring приложением и PostgreSQL
2.0 Middle🔥 251 комментариев
#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ
Как происходит общение между Spring приложением и PostgreSQL
Общение между Spring и PostgreSQL - это многоуровневый процесс с JDBC драйвером, connection pool, ORM и транзакциями.
1. Слои архитектуры
Spring Application -> JPA/Hibernate -> JDBC -> PostgreSQL Driver -> TCP Connection -> PostgreSQL Server
2. Зависимости (pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.0</version>
</dependency>
3. Конфигурация (application.yml)
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: password
driver-class-name: org.postgresql.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: validate
hikari:
maximum-pool-size: 10
minimum-idle: 2
connection-timeout: 30000
4. Connection Pool (HikariCP)
Spring использует HikariCP для управления соединениями:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
config.setUsername("postgres");
config.setPassword("password");
config.setMaximumPoolSize(10);
config.setMinimumIdle(2);
return new HikariDataSource(config);
}
}
Как работает:
- Приложение запрашивает соединение
- HikariCP проверяет pool
- Если есть свободное - возвращает (быстро)
- Если нет - создаёт новое до максимума
- close() возвращает соединение в pool
5. Выполнение SQL запроса
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUser(Long id) {
// Шаг 1: Hibernate генерирует SQL
// SELECT u FROM User u WHERE u.id = ?
// Шаг 2: JDBC подготавливает PreparedStatement
// Шаг 3: PostgreSQL Driver отправляет TCP запрос
// Шаг 4: PostgreSQL выполняет (PARSE-BIND-EXECUTE)
// Шаг 5: Возвращает ResultSet
// Шаг 6: Hibernate маппирует в объект User
return userRepository.findById(id).orElse(null);
}
}
6. Безопасность - PreparedStatements
// ПРАВИЛЬНО - защита от SQL injection
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
// НЕПРАВИЛЬНО - опасно!
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
7. Транзакции
@Service
public class OrderService {
@Transactional
public void createOrder(Long userId, OrderDTO dto) {
// BEGIN TRANSACTION
User user = userRepository.findById(userId).orElseThrow();
Order order = new Order();
order.setUser(user);
orderRepository.save(order);
// COMMIT (если успешно) или ROLLBACK (если ошибка)
}
}
8. Логирование SQL
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
9. Connection Lifecycle
- BORROW - запрос соединения
- INITIALIZE - установка TCP подключения
- VALIDATE - проверка isValid()
- USE - выполнение SQL
- CLOSE - возврат в pool
- IDLE - ожидание в pool
- EVICT - закрытие старых соединений
10. Мониторинг в PostgreSQL
-- Активные соединения
SELECT * FROM pg_stat_activity;
-- Количество соединений
SELECT count(*) FROM pg_stat_activity;
Best Practices
- Используй Connection Pool - не создавай соединения вручную
- Pool size = CPU cores * 2
- Используй @Transactional для транзакций
- Тестируй с реальной БД
- Мониторь pool на утечки соединений
- Используй индексы в PostgreSQL
- Логируй SQL при разработке
Краткий цикл: Spring -> JPA/Hibernate -> JDBC -> PostgreSQL Driver -> TCP Connection -> PostgreSQL Server. Всё координируется через Connection Pool и Transaction Manager.