【发布时间】:2016-03-10 04:07:11
【问题描述】:
摘要:
我工作的应用程序使用顶部链接,我无法确定顶部链接是否以及何时自动使用绑定变量。
问题描述:
假设我需要做一些类似于验证满载人员的车辆是否可以在某个地方旅行,每个人都可以使旅行无效,并提供错误消息,以便人们可以在旅行开始之前取消他们的限制。一种简单的方法是验证列表中的每个成员,并显示错误列表。假设他们的信息存储在 oracle 数据库中,我使用他们的唯一 ID 查询每个骑手的信息,此查询将为列表中的每个成员执行。一个简单的实现会导致一个硬解析,一个新的执行路径,尽管只有唯一的 id 发生了变化。
我一直在阅读 sql 中的绑定变量,以及它们如何允许重用执行路径,避免 CPU 密集型硬解析。 他们的几个链接是:
- 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 解析一个新的执行路径?
我发现了什么:
如果我对 DatabaseQuery 类中的 bindAllParameters 函数有足够的了解,那么它很简单就是阻止 sql 注入攻击的类型验证。
在同一个类中还有一个 shouldPrepare 函数,但是这似乎必须在允许动态 sql 使用时做更多的事情,其中参数的数量是可变的。准备好的 DatabaseQuery 的 sql 只编写一次,变量的值根据传入的参数列表发生变化,这听起来像是简单的替换,而不是绑定变量。
所以我迷路了。
【问题讨论】: