3

websql に挿入する必要がある約 300 のレコードがあります。まず、パラメーターなしで 300 の個別の tx.executeSql 挿入ステートメントを作成しました。

tx.executeSql("INSERT INTO `beerlist` VALUES ('1', '21st Amendment', 'Back in Black IPA', '83', 'IPA', 'A');");

Chrome では、これには 2 ミリ秒かかります。Android で phonegap を介して実行すると、約 43,438 ミリ秒かかります。そこで、いくつかの JSON を繰り返し処理し、prepare ステートメントを使用することに切り替えました。そのようです:

var beerList = {"beers":[{"beerid":"1","brewery":"21st Amendment","beername":"Back in Black IPA","bascore":"83","beertype":"IPA","beertable":"A"}}

$.each(beerList.beers, function(i, object) {
                    var insert = 'INSERT INTO beerlist VALUES (?, ?, ?, ?, ?, ?)';
                    tx.executeSql(insert, [object.beerid, object.brewery, object.beername, object.bascore, object.beertype, object.beertable], Beer.successInsert, Beer.failureInsert);
                });

どこで準備が速くなるかを読みましたが、Chrome でも同じパフォーマンスが見られますが、実際には Android の Phonegap で 53,559 ミリ秒のわずかに悪いパフォーマンスが見られます。300 レコードを挿入するのに 50 秒もかかるなんて信じられません。何かご意見は?

4

2 に答える 2

4

複数のトランザクションを使用していますか? 遅いのはおそらく挿入ではなく、トランザクションです。単一のトランザクションにラップされた複数の実行はかなり高速です

db.transaction( function(tx){
    for (var i = 0; i < args; i++)
    {
        tx.executeSql(sqlStmnt, args[i]); //args is nested [[1,2],[1,3]]
    }
},
dfd.reject,
dfd.resolve);
于 2013-04-08T14:35:57.633 に答える
0

ご覧のとおり、executeSql の成功ハンドラーはトランザクション オブジェクトで呼び出されました。秘訣は、そのトランザクションを再利用して、並列リクエストを送信することです。基本的に、単一のトランザクションを使用しますが、複数の非同期リクエストの制御された実行を使用します。数ミリ秒以内に保存できるはずです。

あなたの例では、それは制御されていません。300 件のリクエストはすべてキューに入れられ、いずれも実行されません。ブラウザがクラッシュすることさえあります。

実装例はhttps://bitbucket.org/ytkyaw/ydn-db/raw/master/js/ydn/db/core/req/websql.jsの putObjects メソッドにあります。

于 2013-01-16T04:46:56.117 に答える