2010-10-14 18 views
5

Tôi mới sử dụng các ứng dụng HTML5. Trong này tôi muốn chèn 1000 hồ sơ vào cơ sở dữ liệu sqlite bằng cách sử dụng HTML5. Quá trình này rất chậm. Cách sử dụng BEGIN/COMMIT trước khi chèn bản ghi. Bằng cách này để tăng tốc độ chèn. Xin hãy hướng dẫn tôi bất cứ ai. Cảm ơn trước. Vui lòng chạy ví dụ này trong trình duyệt chrome. Đây là mã để bạn tham khảo:Cách tăng tốc quá trình khi chèn 1000 bản ghi vào sqlite bằng cách sử dụng HTML5

<!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> 

Kính trọng, Neeraja.

+0

Làm thế nào chậm? Và trình duyệt nào? Bất kỳ mã mẫu để xem xét? Có thể không phải là SQLite liên quan, nhưng tôi tin rằng nó có thể có thể được. – Frank

+1

Bạn có thực sự thực hiện một truy vấn để đếm các bản ghi trong bảng nhật ký như một phần của mỗi lần chèn nhật ký không? Điều đó sẽ làm chậm bạn khá đáng kể. –

+0

cố gắng sử dụng công cụ web html5. –

Trả lời

1

Bạn đang bắt đầu 1000 giao dịch. Cam kết giao dịch chậm vì nó được liên kết với tốc độ ổ đĩa cứng. Xem this

+0

Tôi muốn có bất kỳ ý tưởng nào từ bạn. – Neeraja

+1

Đặt tất cả 'INSERT' của bạn vào cùng một giao dịch. Đó là tất cả! – Benoit

+0

Tôi không nhận được bạn. Vui lòng sửa đổi mã trên và gửi cho tôi. – Neeraja

0

Bạn đã có mã để đặt 1000 lần chèn vào bên trong một giao dịch. Đối với một số lý do nó được nhận xét ra. Xóa các bình luận và bạn đã hoàn thành!

db.transaction(function(tx){tx.executeSql("BEGIN",[]);}); 
for(var i=0;i<1000;i++) 
{ 
    txquer(i,"test"); 
} 
db.transaction(function(tx){tx.executeSql("COMMIT",[]);}); 
7

Vấn đề này là bạn đang sử dụng giao dịch riêng cho mỗi bước, thay vì sử dụng lại nó, vì vậy tại sao nó hoạt động kém.

db.transaction Là giao dịch, vì vậy không cần BEGIN/COMMIT.

Hãy thử điều này:

<!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> 
+0

Tôi không thể thực hiện giải pháp này. Chỉ tôi thôi à ? Tôi tìm thấy một giải pháp khác trên http://isgeek.eu/?p=59 –

0

Tôi giải quyết nó, có thể làm việc này. Sử dụng 'chèn chọn công đoàn tất cả' thay vì tạo 1000 câu lệnh chèn. Nhưng điều này có thể chèn chỉ 500 hàng tại một thời điểm. Đây là mã mà tôi làm việc trên, làm một bài kiểm tra trên google chrome tôi chắc chắn nó hoạt động.

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

Status nhắn

0

Tôi đã thực sự viết một mã nguồn mở nhỏ javascript module gọi html5sql.js mà giải quyết vấn đề này rất. Tin tốt là html5sql.js thực sự nhanh. Trên trang web http://html5sql.com Tôi có một bản demo tạo bảng và chèn 11000 bản ghi vào bảng đó, thường trong chưa đầy một hoặc hai giây. Nếu bất cứ ai vẫn còn đối phó với vấn đề này tôi khuyên bạn nên kiểm tra html5sql.js ra.

+0

tôi đã thử mô-đun đó hoạt động tốt trong môi trường máy tính để bàn.Nhưng để intregrate trong như là một ứng dụng Android là một câu chuyện khác nhau.How abouth một hỗ trợ/demo/hướng dẫn cho điều đó? – wHiTeHaT

Các vấn đề liên quan