Исключение ограничений с PreparedStatments - PostgreSQL - PullRequest
1 голос
/ 29 октября 2011

Согласно разделу документации PostgreSQL: 5.9.6. Предостережения

Исключение ограничения работает только тогда, когда предложение WHERE содержит константы. Параметризованный запрос не будет оптимизирован, так как планировщик не может знать, какие разделы может выбрать значение параметра во время выполнения.

Есть ли какая-либо библиотека, которая предоставляет какой-то вид PreparedStatement (я имею в виду только средство SQL-инъекции, поскольку мы не могли получить выгоду от оптимизированной производительности PreparedStatement), а также генерирует статическую строку SQL, чтобы мы могли воспользоваться функцией исключения ограничений

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Apache commons-lang имеет базовый метод экранирования ... javadoc:

Например,

statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" + 
   StringEscapeUtils.escapeSql("McHale's Navy") + 
   "'");

В настоящее время этот метод превращает только одинарные кавычки в двойные одинарные кавычки("Военно-морской флот Макхейла" => "Военно-морской флот Макхейла").Он не обрабатывает случаи процентов (%) или подчеркивания (_) для использования в предложениях LIKE.

http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringEscapeUtils.html#escapeSql(java.lang.String%29

HTH

1 голос
/ 29 октября 2011

Вы можете настроить драйвер JDBC PostgreSQL для переключения на подготовленные операторы после определенного количества вызовов. См. Подключение к базе данных переменная prepareThreshold, а также перейдите по ссылке в этом разделе.

В вашем случае вы можете попробовать значение 0 или очень большое число. Я не уверен, означает ли 0 «использовать готовые операторы немедленно» или «никогда не использовать готовые операторы». Большое количество должно обязательно помешать подготовленным заявлениям.

Используя этот метод, ваш Java-код все еще использует PreparedStatement, а драйвер отвечает за правильное цитирование. Протокол между драйвером и сервером будет использовать «неподготовленные» операторы.

...