我有一个xsjs服务,它用来自另一个表的数据填充一些表。运行一段时间后,服务显示以下错误: InternalError: dberror(Connection.prepareStatement):608 -超过最大预准备语句数:每个连接的预准备语句数不能超过最大语句数
我在for循环中使用prepareStatement语句在开头打开了一个$.db.getConnection(),在结尾只打开了一个。(有几个类似于其他表的循环)
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数量的信息。有吗?
谢谢你。
发布于 2019-10-20 06:42:35
这里的问题不是每个连接都有预准备语句的限制,而是代码在循环中不必要地创建了新的预准备语句。
预准备语句的整个思想是重用。当运行多个在结构上相同且仅在所涉及的实际值上不同的语句时,使用预准备语句允许解析、检查和优化一次查询结构,并一次又一次地重用它。
与其为每个insert创建准备好的语句对象,不如在嵌套循环构造之前创建一次。使用绑定变量可以提高insert语句的执行速度和安全性,而不是将引号和逗号分隔的值粘贴到SQL字符串中。
此外,每次插入后都有一个COMMIT
。如果确实需要这样做,那么使用自动提交连接可能是更好的选择。如果不是必需的,COMMIT
应该只在循环结束后发送一次。这不仅仅是性能问题(COMMIT
总是同步的--您的代码正在等待它),而且可能只插入了一半的记录。
最后,代码使用两种不同的连接方法$.db.getConnection
和$.hdb.db.connection
来创建两个独立的连接对象。对于给定的上下文,这是不必要的,并且相当混乱。只需使用较新的$.hdb.db.connection
和单个连接就足够了。
https://stackoverflow.com/questions/58447375
复制相似问题