Столбец не индексируется, хотя это так.PreparedStatement внутри - PullRequest
2 голосов
/ 11 ноября 2011

Я действительно борюсь с ошибкой, которая не появлялась в моей среде разработки, только однажды развернутая в тесте.

Я использую подготовленный оператор для выполнения около 30 000 запросов подряд. Запрос проверяет сходство строки с тем, что находится в нашей базе данных, используя нечеткий метод оракула.

Проверенный столбец проиндексирован, но, не знаю почему, после некоторых итераций он случайно завершается ошибкой, говоря, что индекс не существует.

Я не понимаю, что происходит, так как индекс действительно существует. Мой метод никогда не перестраивает и не удаляет индекс, поэтому нет причин для появления этой ошибки ...

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

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Я никогда не использовал текстовые таблицы Oracle, но мой совет: убедитесь, что никто не выполняет операторы DDL для таблицы одновременно.Также убедитесь, что у вас есть индекс контекста.

0 голосов
/ 10 октября 2014

Создайте индекс для вашего столбца, к которому вы хотите применить поиск

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

CREATE INDEX "MTU219". "SEARCHFILTER" ON "BL_SUSPICIOUS_ELEMENT" ("LASTNAME") INDEXTYPE - это «CTXSYS». «CONTEXT» ПАРАМЕТРЫ ('хранилище CTXSYS.ST_MTED_NORMAL SYNC (ON COMMIT)');

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...