2011-11-11 8 views
2

私は開発環境に表示されなかったバグに苦労しています。列は索引付けされていません。 PreparedStatement inside

私は準備文を使用して、約30,000のクエリを連続して実行しています。問合せは、oracleファジィ・メソッドを使用して、データベース内の文字列との類似性をチェックします。

チェックされた列は索引付けされていますが、索引が存在しないという理由で一部の反復処理後にランダムに失敗する理由はわかりません。

インデックスが実際に存在するため、私は何が起こっているのか分かりません。このエラーが表示される理由はないので、私の方法は、インデックスを再構築したり、削除しない...

public List<EntryToCheck> checkEntriesOnSuspiciousElement(List<EntryToCheck> entries, int type,int score, int numresults, int percentage) throws Exception { 
    Connection connection = null; 
    PreparedStatement statementFirstName = null; 
    PreparedStatement statementLastname = null; 

    int finalScore = checkScore(score); 
    int finalNumResults = checkNumResults(numresults); 
    int finalPercentage = checkPercentage(percentage); 
    try { 
    connection = dataSource.getConnection(); 

    StringBuilder requestLastNameOnly = new StringBuilder("SELECT SE.ELEMENT_ID, SE.LASTNAME||' '||SE.FIRSTNAME AS ELEMENT, SCORE(1) AS SCORE "); 
    requestLastNameOnly.append("FROM BL_SUSPICIOUS_ELEMENT SE "); 
    requestLastNameOnly.append("WHERE CONTAINS(SE.LASTNAME, 'fuzzy({' || ? || '},' || ? || ',' || ? || ', weight)', 1)>? "); 
    requestLastNameOnly.append((type > 0 ? "AND SE.ELEMENT_TYPE_ID = ? " : " ")); 
    requestLastNameOnly.append("ORDER BY SCORE DESC"); 

    statementLastname = connection.prepareStatement(requestLastNameOnly.toString()); 
    for (EntryToCheck entryToCheck : entries) { 
      ResultSet rs; 
      boolean withFirstName = (entryToCheck.getEntryFirstname() != null && !entryToCheck.getEntryFirstname().equals("")); 
       statementLastname.setString(1, entryToCheck.getEntryLastname().replaceAll("'","''")); 
       statementLastname.setInt(2, finalScore); 
       statementLastname.setInt(3, finalNumResults); 
       statementLastname.setInt(4, finalPercentage); 

       if(type > 0){ 
        statementLastname.setInt(5, type); 
       } 
       System.out.println("Query LastName : " + entryToCheck.getEntryLastname().replaceAll("'","''")); 
       rs = statementLastname.executeQuery(); 

      while (rs.next()) { 

       Alert alert = new Alert(); 
       alert.setEntryToCheck(entryToCheck); 
       alert.setAlertStatus(new AlertStatus(new Integer(AlertStatusId.NEW))); 
       alert.setAlertDate(new Date()); 
       alert.setBlSuspiciousElement(new BlSuspiciousElement(new Integer(rs.getInt("ELEMENT_ID")))); 
       alert.setMatching(rs.getString("ELEMENT") + " (" + rs.getInt("SCORE") + "%)"); 
       entryToCheck.addAlert(alert); 
       } 

     } 
    } 
     catch (Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 
     finally { 
      DAOUtils.closeConnection(connection, statementLastname); 
     } 

     return entries; 
} 

は本当に...を見て何

感謝を知りません!

F

答えて

1

私は、Oracleのテキストテーブルを使用することはありませんが、私のアドバイスは次のとおりです。 誰もが同時にテーブルにDDL文を実行していないことを確認します。 また、インデックスがコンテキストインデックスであることを確認してください。

0

検索を適用する列のインデックスを作成します。

.............................. ..........

INDEX "MTU219"。 "SEARCHFILTER" "BL_SUSPICIOUS_ELEMENT"( "LASTNAME") INDEXTYPEが "CTXSYS" である。 "コンテキスト" パラメータ(「ストレージCTXSYS.ST_MTED_NORMAL SYNC ONのCREATE (ON COMMIT) ');

..........................................

関連する問題