HANA XSJS - InternalError: dberror (Connection.prepareStatement): 608 - превышать максимальное количество подготовленных операторов - PullRequest
0 голосов
/ 18 октября 2019

У меня есть служба xsjs, которая заполняет некоторые таблицы данными из другой таблицы. после некоторого времени работы служба выдает следующую ошибку: InternalError: dberror (Connection.prepareStatement): 608 - превышает максимальное количество подготовленных операторов: число подготовленных операторов на соединение не может превышать max операторов

I'mоткрытие $ .db.getConnection () в начале и только закрытие в конце с оператором prepareStatement в цикле for. (есть несколько циклов, таких как один ниже для других таблиц)

var aSQL = "select field from table";
var conn  = $.hdb.getConnection(); var connInsert  = $.db.getConnection();
var rsLevel1 = conn.executeQuery(aSQL);

var s = {};
var loc_descr_group = [];
var row = {};

for (i = 0; i < rsLevel1.length; i++) {
    var entry = rsLevel1[i].field;
    var split = entry.split(",");
    for (var j = 0; j<split.length; j++){
        if (loc_descr_group.indexOf(split[j]) == -1){
            loc_descr_group.push(split[j]);
            var value = split[j].replace(/'/g,"''");

            sSQL = "insert into another_table "
                + " values ('"+value+"')";
            pstmt = connInsert.prepareStatement(sSQL);

            pstmt.execute(); 
            connInsert.commit();

        }
    }
}
connInsert.close();
conn.close();

Я не смог найти никакой информации о максимальном количестве prepareStatement, используемом в xsjs. Есть ли один?

Спасибо.

1 Ответ

0 голосов
/ 20 октября 2019

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

Вся идея подготовленных операторов заключается в повторном использовании. При выполнении нескольких операторов, которые являются структурно одинаковыми и отличаются только фактическими значениями, использование подготовленных операторов позволяет один раз проанализировать, проверить и оптимизировать структуру запроса и использовать ее снова и снова.

Вместо созданияподготовленный объект оператора для каждой вставки, гораздо лучше создать его один раз перед конструкцией вложенного цикла. И вместо вставки заключенных в кавычки и разделенных запятыми значений в строку SQL вместо использования переменных связывания можно повысить как скорость выполнения, так и безопасность оператора вставки.

Кроме того, после каждой вставки есть COMMIT. Если это действительно необходимо, то лучше использовать соединение с автоматической фиксацией. Если это не требуется, COMMIT следует отправлять только один раз после окончания цикла. Это не только вопрос производительности (COMMIT s всегда синхронны - ваш код ждет этого), но и, возможно, половина вставленных записей.

Наконец, код использует два разных метода подключения $.db.getConnection и $.hdb.db.connection для создания двух отдельных объектов подключения. Для данного контекста это является ненужным и довольно запутанным. Достаточно просто использовать более новый $.hdb.db.connection, и достаточно одного подключения.

...