Аннотация:.Toplink, пути класса DatabaseQuery и выполнение оракула, избежав hardparses
Применение я работаю использует верхнее звено, у меня возникают проблемы с поиском, если и когда верхняя ссылка автоматически использует переменные связывания.
Описание проблемы:
Позволяет сказать, что мне нужно сделать что-то похожее на проверки, если транспортное средство полно людей может путешествовать куда-нибудь, где каждый человек может аннулировать поездку, и предоставить сообщения об ошибках, так что человек может получить их ограничения удалены до начала поездки. Простым способом сделать это является проверка каждого члена в списке и отображение списка ошибок. Допустим, что их информация хранится в базе данных оракула, и я запрашиваю для каждой информации о гонщиках свои уникальные идентификаторы. Этот запрос будет выполнен для каждого члена в списке. Наивная реализация вызовет жесткий анализ, новый путь выполнения, несмотря на изменение только уникального идентификатора.
Я читал о переменных привязки в sql и о том, как они позволяют повторно использовать путь выполнения, избегая интенсивных анализов процессора. Пара ссылок на них:
- http://www.akadia.com/services/ora_bind_variables.html
- https://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables
Применение я работаю использует 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, написанный один раз, с переменными, изменяющимися в зависимости от переданного списка аргументов, который звучит как простая подстановка и не связывает переменные.
Так что я нахожусь в пропаже.