Что является лучшей альтернативой выполнению BatchStatement для извлечения значений из базы данных (MSSQL 2008) - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть SQL-запрос, как показано ниже.

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID =?

Коллекция идентификаторов передается этому запросу и запускается как пакетный запрос. Это выполняется за 10000 время для извлечения значений из базы данных. (Некоторые еще беспорядок)

public static Map getOBLDefinitionsAsMap(Collection oblIDs)
        throws java.sql.SQLException
    {
        Map retVal = new HashMap();
        if (oblIDs != null && (!oblIDs.isEmpty()))
        {
            BatchStatementObject stmt = new BatchStatementObject();
            stmt.setSql(SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID=?);
            stmt.setParameters(
                    PWMUtils.convertCollectionToSubLists(taskIDs, 1));        
            stmt.setResultsAsArray(true);
            QueryResults rows = stmt.executeBatchSelect();
            int rowSize = rows.size();
            for (int i = 0; i < rowSize; i++)
            {
                QueryResults.Row aRow = (QueryResults.Row) rows.getRow(i);
                CoblDefinition ctd = new CoblDefinition(aRow);


                retVal.put(aRow.getLong(0), ctd);
            }
        }

        return retVal;

Теперь мы определили, что если запрос изменяется на добавить как

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID in (???)

, чтобы мы могли уменьшить его до 1 запроса.

Проблема в том, что сервер MSSQL выдает исключение,

 Prepared or callable statement has more than 2000 parameter

И были поражены здесь. Может ли кто-нибудь предоставить лучшую альтернативу этому

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Максимально допустимое количество параметров, назовем его n. Вы можете сделать одно из следующего:

  • Если у вас есть параметры m * n + k, вы можете создать m пакетов (или m + 1 пакетов, если k не равно 0). Если у вас есть 10000 параметров, а 2000 - максимально допустимые параметры, вам потребуется только 5 пакетов.

  • Другим решением является создание строки запроса в вашем приложении и добавление параметров в виде строки. Таким образом, вы будете выполнять свой запрос только один раз. Это очевидная оптимизация по скорости, но в вашем приложении будет сгенерирована строка запроса. Вы должны установить свой пункт where следующим образом:

String myWhereClause = "где TaskID =" + taskIDs [0];

для (int i = 1; i

{

myWhereClause += " or TaskID = " + taskIDs[i];

}

1 голос
/ 02 декабря 2011

Похоже, вы используете свою собственную оболочку для PreparedStatement и addBatch ().Вы явно достигаете предела того, сколько операторов / параметров может быть упаковано одновременно.Вам нужно будет использовать операторы executeBatch (например, каждые 100 или 1000) вместо того, чтобы его наращивать до достижения предела.

Редактировать: На основе приведенного ниже комментария я перечитал проблему,Решение: убедитесь, что вы используете менее 2000 параметров при построении запроса.Если необходимо, разбейте его на два или более запросов, как требуется.

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