Как ускорить процесс при вставке 1000 записей в sqlite с использованием HTML5 - PullRequest
5 голосов
/ 14 октября 2010

Я новичок в разработке приложений HTML5.В этом я хочу вставить 1000 записей в базу данных sqlite с использованием HTML5.Этот процесс очень медленный.Как использовать 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.

Ответы [ 5 ]

7 голосов
/ 18 октября 2010

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

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 голос
/ 14 октября 2010

Вы начинаете 1000 транзакций. Передача транзакции выполняется медленно, поскольку она связана со скоростью жесткого диска. Смотри это

0 голосов
/ 09 сентября 2011

Я на самом деле написал небольшой модуль javascript с открытым исходным кодом под названием html5sql.js , который решает эту проблему.Хорошей новостью является то, что html5sql.js действительно быстрый.На веб-сайте http://html5sql.com у меня есть демонстрационная программа, которая создает таблицу и вставляет в нее 11 000 записей, обычно менее чем за секунду или две.Если кто-то все еще имеет дело с этой проблемой, я рекомендую проверить html5sql.js.

0 голосов
/ 27 мая 2011

Я решил, может быть, это работает. Используйте «insert select union all» вместо создания 1000 операторов вставки. Но это может вставить только 500 строк за раз. Вот код, над которым я работал, сделайте тест на Google Chrome, я уверен, что он работает.

<!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);
});
}

Статус

0 голосов
/ 15 октября 2010

У вас уже есть код для размещения 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",[]);});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...