我刚开发HTML5应用程序。在这里我想用HTML5将1000条记录插入sqlite数据库。这个过程非常缓慢。如何在插入记录之前使用BEGIN / COMMIT。以这种方式加快插入。请指导我任何人。提前致谢。请在Chrome浏览器中运行此示例。 这是供您参考的代码:
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;
//db.transaction(function(tx){tx.executeSql("BEGIN",[]);});
for(var i=0;i<1000;i++)
{
txquer(i,"test");
}
//db.transaction(function(tx){tx.executeSql("COMMIT",[]);});
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<p>Found rows: " + len + "</p>";
document.querySelector('#status').innerHTML += msg;
}, null);
});
function txquer(i,test)
{
db.transaction(
function(tx){
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (?, ?)',[i,test]);
}
);
}
</script>
</head>
<body>
<div id="status" name="status">Status Message</div>
</body>
</html>
此致 Neeraja。
答案 0 :(得分:7)
这个问题是你为每一步使用一个单独的事务,而不是重复使用它,因此它运行得很差。
db.transaction是一个事务,因此不需要BEGIN / COMMIT。
试试这个:
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;
db.transaction(function (tx) {
for(var i=0;i<1000;i++)
{
txquer(tx, i,"test");
}
});
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<p>Found rows: " + len + "</p>";
document.querySelector('#status').innerHTML += msg;
}, null);
});
function txquer(tx,i,test)
{
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (?, ?)',[i,test]);
}
</script>
</head>
<body>
<div id="status" name="status">Status Message</div>
</body>
</html>
答案 1 :(得分:1)
您正在开始1000笔交易。提交事务很慢,因为它与硬盘驱动器速度相关联。见this
答案 2 :(得分:0)
您已经拥有将1000个插入内容放在单个事务中的代码。出于某种原因,它被注释掉了。删除评论,你就完成了!
db.transaction(function(tx){tx.executeSql("BEGIN",[]);});
for(var i=0;i<1000;i++)
{
txquer(i,"test");
}
db.transaction(function(tx){tx.executeSql("COMMIT",[]);});
答案 3 :(得分:0)
我解决了,可能这是有效的。使用'insert select union all'而不是创建1000个insert语句。但是这一次只能插入500行。这是我工作的代码,在谷歌浏览器上进行测试我确信它有效。
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;
var j=1;
var i=1;
var quer="";
db.transaction(function(tx){tx.executeSql("CREATE TABLE IF NOT EXISTS LOGS (ID INTEGER PRIMARY KEY ASC, todo TEXT)",[]);});
db.transaction(function(tx){tx.executeSql("delete from logs",[]);});
txquer();
showMsg();
function txquer()
{
quer="insert into logs ";
for(i=j;i<=j+498;i++)
{
quer+=" select "+i+",'test' union all";
}
quer+=" select "+i+",'test' ; ";
j=i+1;
db.transaction(
function(tx){
tx.executeSql(quer,[]);
}
);
}
function showMsg(){
db.transaction(function (tx) {
tx.executeSql('SELECT count(*) todo FROM LOGS', [], function (tx, results) {
var len = results.rows.item(0).todo;
msg = "<p>Found rows: " + len + "</p>";
document.querySelector('#status').innerHTML += msg;
}, null);
});
}
状态消息
答案 4 :(得分:0)
我实际上已经编写了一个名为html5sql.js的小型开源javascript模块,它解决了这个问题。好消息是html5sql.js非常快。在网站http://html5sql.com上,我有一个演示,它创建一个表并在该表中插入11000条记录,通常不到一两秒钟。如果有人还在处理这个问题我建议检查html5sql.js。