2015-10-29 1 views
0

Аннотация:.Toplink, пути класса DatabaseQuery и выполнение оракула, избежав hardparses

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

Описание проблемы:

Позволяет сказать, что мне нужно сделать что-то похожее на проверки, если транспортное средство полно людей может путешествовать куда-нибудь, где каждый человек может аннулировать поездку, и предоставить сообщения об ошибках, так что человек может получить их ограничения удалены до начала поездки. Простым способом сделать это является проверка каждого члена в списке и отображение списка ошибок. Допустим, что их информация хранится в базе данных оракула, и я запрашиваю для каждой информации о гонщиках свои уникальные идентификаторы. Этот запрос будет выполнен для каждого члена в списке. Наивная реализация вызовет жесткий анализ, новый путь выполнения, несмотря на изменение только уникального идентификатора.

Я читал о переменных привязки в sql и о том, как они позволяют повторно использовать путь выполнения, избегая интенсивных анализов процессора. Пара ссылок на них:

Применение я работаю использует TopLink и делает что-то похожее на ситуацию, описанную выше. Я ищу, чтобы сделать проверку быстрее, не меняя ее.

Если я что-то вроде следующего:

Псевдо-код

public class userValidator{ 
    private static DataReadQuery GET_USER_INFO; 
    static{ 
    GET_USER_INFO = "select * from schema.userInfo ui where ui.id= #accountId" 
    GET_USER_INFO.bindAllParameters(); 
    GET_USER_INFO.cacheStatement(); 
    GET_USER_INFO.addArgument("accountId", String.class); 
    } 

    void validate(){  
    List<String> listOfUserAccountIds = getuserAccountIdList(); 
    list args; 
    for(String userAccountId: listOfUserAccountIds){ 
     args = new ArrayList(1); 
     args.add(userAccountId) 
     doSomethingWithInfo(getUnitOfWork().executequery(GET_USER_INFO, args); 
    } 
    } 
} 

Вопрос:

Будет ли новый путь выполнения анализироваться для каждого исполнения GET_USER_INFO?

То, что я нашел:

Если я понимаю функцию bindAllParameters внутри класса DatabaseQuery достаточно хорошо, это просто тип проверки, чтобы остановить SQL-инъекций.

Существует также функция shouldPrepare внутри одного и того же класса, однако, похоже, что нужно делать больше, позволяя динамическое использование sql, где число аргументов является переменной. Подготовленный DatabaseQuery имеет свой sql, написанный один раз, с переменными, изменяющимися в зависимости от переданного списка аргументов, который звучит как простая подстановка и не связывает переменные.

Так что я нахожусь в пропаже.

ответ

0

Это кажется ответил на TopLink documentation

По умолчанию TopLink позволяет параметризированный SQL, но не готово кэширования отчетности.

Подготовленные операторы используются по умолчанию, просто не кэшируются. Это означает, что в последующих запросах будут добавлены затраты на повторную подготовку заявлений, если они не будут оптимизированы драйвером. См. this для получения дополнительной информации об оптимизации в TopLink