HTML5 Web SQL DB - 最大表大小?

时间:2010-10-28 04:21:59

标签: sql sqlite html5 google-chrome webkit

我通过构建一个相当复杂的HTML5 Web应用程序,从Web服务中检索其数据以填充Web SQL数据库。

测试数据一切顺利,然后我尝试使用一些真实数据(一个包含大约10列和超过180,000行的表)并遇到了一些问题。

我在500个插入的“块”中发送SQL响应,然后运行事务并从Web服务获取下一个响应。这工作正常,直到表达到大约9000行,然后它就不再需要了。此时数据库文件大小仍然低于2MB,我的最大大小设置为20MB,所以我不认为这是问题。

我设法用更简单的代码重新创建类似的问题,所以其他人可以看到我在说什么。 (出于某种原因,我不能把它全部留在“代码块”(对不起))

//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']);
        }

    });
};

请忽略字符串值,它只是填充varchar大小(SQLite似乎不填充char类型)。

在上面的“19000”次迭代(或下面的任意数字)中,将在Chrome中创建表格,并正确输入所有数据。数据库大约4MB。 Safari会让我添加更多行,我在Safari中的数据库大小可达10MB左右。

如果我尝试删除表格内容并将迭代次数增加到20,000次,则Chrome无法完成交易。

有没有人对可能导致这种情况的原因有任何想法?

我希望我已经详细解释了这个问题。如果我太模糊,请随时提出任何问题。

感谢您的帮助。

更新:我尝试添加一些错误处理,响应是“约束失败”。我已经对可能造成这种情况的原因进行了一些研究,但我仍然在努力寻找答案。

2 个答案:

答案 0 :(得分:11)

您可以创建一个简单的Chrome扩展程序,它可以消除本地数据库大小的限制。

答案 1 :(得分:5)

我认为您正在使用硬编码的5MB WebSQL数据库大小限制。我可以像你描述的那样验证你的代码是否失败,就像数据库大小通过(最新的)Chrome v8.0.552.215上的5120K而破灭

错误消息表明已超出允许的内存等。据我所知,Chrome不使用WebSQL数据库大小参数。

有关此on the Chromium group

的更多讨论

约束错误可能是一个单独的问题,因为您可以通过尝试INSERT重复记录来引发此类错误。只需多次运行插入示例代码而不调整迭代初始化和绑定参数就可以导致这种情况。