一些前置问题信息:
我正在尝试将整个表从 MySQL 转换为 SQLite(以及其他表,但从那里开始)。这是必须在java中完成的事情,并且必须能够转换大量。但是,在执行我的 SQLite 语句(相当大)时,整个程序只是锁定并冻结。还有一个事实是,当我在 SQLite 数据库崩溃后查看它时,没有添加任何一行。
其他信息:
- 这些表有 5 列: int | varchar(32) | 整数 | 整数 | 整数
- 这些表有两个键:第 1 列是主键 (id),第 2 列是用户名的唯一键。
Java代码:
MySQL db = new MySQL();
StringBuilder sb = new StringBuilder("INSERT OR IGNORE INTO `playTime` ");
try {
db.open();
ResultSet ret = db.query("SELECT * FROM `playTime`");
int i = 1;
while (ret.next()) {
if (i > 1) {
sb.append("UNION SELECT ").append(i).append(", '").append(ret.getString(2)).append("', ").append(ret.getInt(3)).append(", ").append(ret.getInt(4)).append(", ").append(ret.getInt(5)).append(" ");
} else {
sb.append("SELECT ").append(i).append(" AS 'column1', '").append(ret.getString(2)).append("' AS 'column2', ").append(ret.getInt(3)).append(" AS 'column3', ").append(ret.getInt(4)).append(" AS 'column4', ").append(ret.getInt(5)).append(" AS 'column5' ");
}
i++;
}
db.close();
} catch (SQLException e) {
...
}
此代码为类似于下面的新 SQLite 查询生成一个字符串。我只是添加了换行符以使其可读,但打印的语句是相同的语法顺序。
INSERT OR IGNORE INTO `playTime` SELECT 1 AS 'column1', 'examplename1' AS 'column2', 5696 AS 'column3', 0 AS 'column4', 1 AS 'column5'
UNION SELECT 2, 'examplename2', 18145, 0, 1
UNION SELECT 3, 'examplename3', 69793, 89, 0
UNION SELECT 4, 'examplename4', 51335, 16, 0
...
总体而言,从 MySQL 数据库中获取了 11077 行,然后我尝试将这些行再次添加到我创建的 SQLite 数据库文件中。我知道这是大量数据,但是在执行查询时,程序整个冻结。这可能是线程没有足够大的堆栈大小来完成手头的工作的错误吗?如果是这样,为什么它不会打印 StackOverFlow 错误?
根据我的理解和研究,就 SQLite 的限制而言,我完全在限制范围内。如 sqlite.org 网页 ( http://www.sqlite.org/limits.html ) 所述,sql 语句中文本的最大字节数为 1000000,而我的语句输出约为 480,000 字节。我无法找到与可以编辑的最大行数相关的任何信息,我认为没有任何信息。
我只是重申一下,我没有看到任何可见的 java 错误,程序完全停止/崩溃,然后才能打印出任何有价值的东西。