【问题标题】:Toplink, the DatabaseQuery class and oracle execution paths., Avoiding hardparsesToplink,DatabaseQuery 类和 oracle 执行路径。,避免硬解析
【发布时间】:2016-03-10 04:07:11
【问题描述】:

摘要:

我工作的应用程序使用顶部链接,我无法确定顶部链接是否以及何时自动使用绑定变量。

问题描述:

假设我需要做一些类似于验证满载人员的车辆是否可以在某个地方旅行,每个人都可以使旅行无效,并提供错误消息,以便人们可以在旅行开始之前取消他们的限制。一种简单的方法是验证列表中的每个成员,并显示错误列表。假设他们的信息存储在 oracle 数据库中,我使用他们的唯一 ID 查询每个骑手的信息,此查询将为列表中的每个成员执行。一个简单的实现会导致一个硬解析,一个新的执行路径,尽管只有唯一的 id 发生了变化。

我一直在阅读 sql 中的绑定变量,以及它们如何允许重用执行路径,避免 CPU 密集型硬解析。 他们的几个链接是:

我使用的一个应用程序使用 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 只编写一次,变量的值根据传入的参数列表发生变化,这听起来像是简单的替换,而不是绑定变量。

所以我迷路了。

【问题讨论】:

    标签: java oracle toplink


    【解决方案1】:

    TopLink documentation 似乎回答了这个问题

    默认情况下,TopLink 启用参数化 SQL 但未准备好 语句缓存。

    所以默认使用准备好的语句,只是没有缓存。这意味着如果驱动程序未优化,后续查询将增加重新准备语句的成本。有关 TopLink 内优化的更多信息,请参阅 this

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2021-09-11
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      相关资源
      最近更新 更多