2010-10-28 21 views
4

Je suis à mi-chemin de la construction d'une application Web HTML5 assez complexe, qui récupère ses données à partir d'un service Web pour remplir la base de données Web SQL. Tout allait bien avec les données de test, puis j'ai essayé d'utiliser des données réelles (une table avec environ 10 cols et plus de 180 000 lignes) et rencontré quelques problèmes.HTML5 Web SQL DB - Taille maximale de la table?

J'envoie les réponses SQL en «morceaux» de 500 insertions, puis en exécutant une transaction et en saisissant la réponse suivante du service Web. Cela fonctionne très bien, jusqu'à ce que la table atteigne environ 9 000 lignes et que ça n'en prenne plus. À ce stade, la taille du fichier de base de données est toujours inférieure à 2 Mo et j'ai la taille maximale de 20 Mo, donc je ne pense pas que ce soit le problème.

J'ai réussi à recréer un problème similaire avec un code plus simple, afin que les autres puissent voir de quoi je parle. (Pour une raison quelconque, je ne peux pas tout pour rester dans le « bloc de code » (désolé))

//var qsParm = new Array(); 

var bigData = {}; 
bigData.webdb = {}; 

var readOnly = false; 

bigData.webdb.open = function() { 
    bigData.webdb.db = null; 
    var dbSize = 20 * 1024 * 1024; // 20MB 
    infinity.webdb.db = openDatabase('bigData', '', 'bigData DATA', dbSize); 
}; 

bigData.webdb.onError = function(tx, e) { 
    alert('Something unexpected happened: ' + e.message); 
}; 


bigData.webdb.createTable = function() { 
    var db = bigData.webdb.db; 
    db.transaction(function(tx) {   
     tx.executeSql("CREATE TABLE IF NOT EXISTS [MattTest] ([Foo] VARCHAR(32) PRIMARY KEY ASC, [Bar] VARCHAR(20), [Will] VARCHAR(100), [Smith] VARCHAR(100))", []); 

    }); 

    db.transaction(function(tx) { 
     var i=0; 
     for(i=0; i<19000; i++) 

      tx.executeSql("INSERT INTO [MattTest] (Foo, Bar, Will, Smith) VALUES (?,?,?,?)", ['Foo' + i, 'Bar', 'Now this is the story all about how My life got flipped turned upside down', 'And Id like to take a minute just sit right there Ill tell you how I became the prince of a town called Bel Air']); 
     } 

    }); 
}; 

S'il vous plaît ignorer la valeur de chaîne, son juste petit quelque chose à la taille varchar (SQLite ne semblent remplir un type de caractère).

Lors des itérations "19000" ci-dessus (ou n'importe quel nombre ci-dessous), la table sera créée dans Chrome, avec toutes les données saisies correctement. La base de données sera d'environ 4MB. Safari va me laisser ajouter plus de lignes et j'ai eu la taille de la base de données jusqu'à environ 10 Mo dans Safari.

Si j'essaie de supprimer le contenu de la table et d'augmenter le nombre d'itérations à 20 000, Chrome ne termine pas la transaction.

Est-ce que quelqu'un a des idées sur ce qui pourrait être à l'origine de cela?

J'espère avoir expliqué le problème assez en détail. N'hésitez pas à poser des questions, si j'ai été trop vague.

Merci pour votre aide. Mise à jour: J'ai essayé d'ajouter un traitement d'erreur et la réponse est "échec de la contrainte". J'ai fait quelques recherches sur ce qui pourrait en être la cause, mais je me bats encore pour trouver une réponse.

Répondre

5

Je pense que vous utilisez une limite de taille de base de données WebSQL de 5 Mo de Chrome. Je peux vérifier que votre code échoue comme vous le décrivez, tout comme la taille de la base de données passe à 5120K (le dernier) Chrome v8.0.552.215

Le message d'erreur indique que la mémoire autorisée a été dépassée, etc. Pour autant que je sachez que Chrome n'utilise pas les paramètres de taille de base de données WebSQL.

Plus discussion sur ce on the Chromium group

L'erreur de contrainte peut être une question distincte que vous pouvez obtenir une telle erreur en tentant d'insérer un enregistrement en double. L'exécution de votre exemple de code d'insertion plusieurs fois sans modifier les paramètres d'itération init et bounds peut en être la cause.

11

Vous pouvez créer une extension chromée simple qui supprime la restriction de la taille de la base de données locale.

+2

Je ne vois pas pourquoi cette réponse a été rejetée. Timo est correct: avec les extensions Chrome, vous pouvez ajouter "unlimitedStorage" au tableau des permissions. Dans mon expérience, cela permet des bases de données de taille illimitée. –