簡體   English   中英

Toplink,DatabaseQuery類和oracle執行路徑。

[英]Toplink, the DatabaseQuery class and oracle execution paths., Avoiding hardparses

抽象:

我正在使用的應用程序使用頂部鏈接,但是我很難確定頂部鏈接是否以及何時自動使用綁定變量。

問題描述:

可以說,我需要做一些類似於驗證是否有人滿載的車輛可以在某個地方行駛的信息,每個人都可以使旅行無效,並提供錯誤消息,以便該人可以在旅行開始之前解除限制。 一種簡單的方法是驗證列表中的每個成員,並顯示錯誤列表。 可以說他們的信息存儲在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編寫一次,只是變量的值根據傳入的參數列表而變化,這聽起來像是簡單的替換,而不是綁定變量。

所以我迷路了。

TopLink文檔似乎回答了這一問題

默認情況下,TopLink啟用參數化SQL,但不啟用預准備語句緩存。

因此,默認情況下使用預處理語句,只是不進行緩存。 這意味着如果驅動程序未對其進行優化,則后續查詢將增加重新准備語句的成本。 對中的TopLink優化的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM