← Назад к вопросам

Как происходит общение между 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

  1. BORROW - запрос соединения
  2. INITIALIZE - установка TCP подключения
  3. VALIDATE - проверка isValid()
  4. USE - выполнение SQL
  5. CLOSE - возврат в pool
  6. IDLE - ожидание в pool
  7. EVICT - закрытие старых соединений

10. Мониторинг в PostgreSQL

-- Активные соединения
SELECT * FROM pg_stat_activity;
-- Количество соединений
SELECT count(*) FROM pg_stat_activity;

Best Practices

  1. Используй Connection Pool - не создавай соединения вручную
  2. Pool size = CPU cores * 2
  3. Используй @Transactional для транзакций
  4. Тестируй с реальной БД
  5. Мониторь pool на утечки соединений
  6. Используй индексы в PostgreSQL
  7. Логируй SQL при разработке

Краткий цикл: Spring -> JPA/Hibernate -> JDBC -> PostgreSQL Driver -> TCP Connection -> PostgreSQL Server. Всё координируется через Connection Pool и Transaction Manager.