0

我有一个 xsjs 服务,它正在用另一个表中的数据填充一些表。运行一段时间后,服务给出以下错误:InternalError: dberror(Connection.prepareStatement): 608 - 超出最大准备语句数:每个连接的准备语句数不能超过最大语句

我在开头打开一个 $.db.getConnection() 并且只在最后关闭,并在 for 循环上使用 prepareStatement 语句。(有几个循环像下面的其他表一样)

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();

我找不到有关 xsjs 上使用的最大 prepareStatement 数量的任何信息。有吗?

谢谢你。

4

1 回答 1

0

这里的问题不在于预准备语句的每个连接有限制,而是代码不必要地在循环中创建新的预准备语句。

准备好的语句的整个想法是重用。当运行多个结构相同且仅覆盖的实际值不同的语句时,使用准备好的语句允许一次解析、检查和优化查询结构,然后一遍又一遍地重用它。

与其为每个插入创建准备好的语句对象,不如在嵌套循环构造之前创建一次要好得多。而不是将引号和逗号分隔的值粘贴到 SQL 字符串中,而是使用绑定变量可以提高插入语句的执行速度和安全性。

此外,COMMIT每个插入后都有一个。如果确实需要,那么使用自动提交连接可能是更好的选择。如果不需要,则COMMIT应该只在循环完成后发送一次。这不仅是性能问题(COMMITs 始终是同步的 - 您的代码会等待它),还可能是插入记录的一半。

最后,代码使用了两种不同的连接方法$.db.getConnection$.hdb.db.connection创建了两个独立的连接对象。对于给定的上下文,这是不必要且相当混​​乱的。只需使用较新$.hdb.db.connection的单一连接就足够了。

于 2019-10-20T06:42:35.250 回答