我在 GoogleScript 上使用 JDBC 与 GoogleCloud MySQL 进行通信。
我的表有 24 列,将 1000 行 ResultSet 加载到数组中大约需要 30 秒。下面代码块中的循环占用了大部分时间。
我是否犯了任何错误导致它这么慢?有没有办法优化这个?有更好的方法吗?
var results = stmt.executeQuery(query);
results.last();
var nrow = results.getRow()
results.first();
var ncol = results.getMetaData().getColumnCount();
var dat = new Array(nrow);
for (var i = 0; i<nrow; i++){
dat[i]=new Array(ncol);
for(var j = 0; j<ncol; j++){
dat[i][j] = results.getString(j+1);
}
results.next();
}
遇到了同样的问题,并意识到这是由新的 V8 运行时迁移引起的。我又回到了旧的,它起作用了,速度变得更快了。我真的不知道为什么它在新版本中不能很好地工作......它应该更好=/
无论如何,您可以在菜单中更改回旧的Rhino版本运行>禁用由V8支持的新Apps脚本。
希望这有帮助。祝你好运!
我也发现自己有这个问题。也许它已经为您解决了,但无论如何,对于任何具有相同问题的潜在未来用户,我想我会分享我的发现。
与 google 支持团队合作,无法对 JDBC 连接进行实质性改进。建立连接需要 2-4 秒,而且 google apps 脚本根本不允许使用任何有效的方法将 JDBC 结果存储到数组中。根据 Google 支持团队的说法,这似乎只是一个固有的限制。
就我而言,与其他一些海报/读者不同,切换回 Rhino 实际上并没有太大影响。
我最终改用谷歌表格作为数据库,通过比较,它平均约为 1.00 秒。以前,这需要 30-120 秒。我的数据集大约有 2000 行,大约 8 列,主要是文本,大小约为 90-100KB。
这个答案很疯狂,但它可以将运行时间减少多达 50% 甚至更多。再加上旧的 Rhino 版本,我发现获取的列越多,迭代过程就越慢;您可以迭代最多 2-3 列,然后对其余列进行另一次迭代,这意味着:
var results = stmt.executeQuery(query);
var results1=results // used to reset 2nd iterator
var results2=results // used to reset 3rd iterator
var results3=results // used to reset 4th iterator
const numCols = results.getMetaData().getColumnCount();
var arr=[];
while (results.next()) {
var rowString=[];
for(var col = 0; col < 3; col++){
rowString.push(results.getString(col + 1))
};
arr.push(rowString);
};
var i=0
while (results1.next()) {
for(col = 3; col < 6; col++){
arr[i].push(results1.getString(col + 1))
};
i++
};
var i=0
while (results2.next()) {
for(col = 6; col < 9; col++){
arr[i].push(results2.getString(col + 1))
};
i++
};
var i=0
while (results3.next()) {
for(col = 9; col < numCols; col++){
arr[i].push(results3.getString(col + 1))
};
i++
};
所用时间:1943 行和 13 列 // 使用 V8 运行时为 8670 毫秒;
经过的时间:1943 行和 13 列为 2004 毫秒 // 没有 V8 运行时;