
Prepared Statement и Java: как не облажаться на собеседовании
karandashov 31 минуту назад Prepared Statement и Java: как не облажаться на собеседовании Простой 7 мин 706 Java * Туториал На PreparedStatement обычно заканчивается вводный курс по JDBC / PostgreSQL. Все довольно...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Вот важная новость с фронта ИИ: karandashov 31 минуту назад Prepared Statement и Java: как не облажаться на собеседовании Простой 7 мин 706 Java * Туториал На PreparedStatement обычно заканчивается вводный курс по JDBC / PostgreSQL. Все довольно просто, пока не задумываешься: а работает ли оно как надо в моем приложении? Разберемся в подробностях и закроем эту тему.
ОсновыБанальный пример на JDBC, как не надо делать:String sql = "select * from users where email = '" + email + "'"; statement. executeQuery(sql); Проблема не только в sql-инъекции. У базы каждый раз новый запрос.
Технические детали
Приходится его парсить, анализировать, строить план и тд. Перепишем на PreparedStatement:var ps = connection. prepareStatement( "select id, email from users where email = ?
setString(1, email); ps. executeQuery(); SQL-шаблон стабилен, значение передается отдельно. В терминах JDBC PreparedStatement — это объект для SQL, который можно заранее подготовить и выполнять много раз с разными параметрами.
Слово “prepared” перегружено:в Java это интерфейс JDBC;в PostgreSQL есть SQL-команды PREPARE / EXECUTE;а еще есть protocol-level prepared statements в extended query protocol: Parse, Bind, Execute. Для Java-разработчика важнее всего именно третий вариант, потому что именно через него обычно работает pgJDBC. Но при этом как раз его и забывают.
Отраслевые последствия
Разберемся по порядку. Custom plan против generic planPrepared statement в PostgreSQL может выполняться с custom plan или generic plan. Custom plan строится под конкретные значения параметров.
Это важно, если распределение данных неровное:select * from orders where created = $1 and deleted = $2; Для deleted = false может быть выгоден один план (построен индекс по created для неудаленных записей). Для deleted = true - другой (редкий запрос, индекса нет). В свою очередь generic plan один для всех значений: он экономит планирование, но иногда хуже исполняется.
По умолчанию PostgreSQL использует эвристику: первые несколько выполнений идут с custom plan, затем сервер сравнивает стоимость generic plan со средней стоимостью custom plan и выбирает, что дальше дешевле. Конечно, есть настройка plan_cache_mode, но ее обычно бзе повода не трогают. Prepared statement не обязан ускорять каждый запрос.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




