执行数千个查询的JavaSQLite
我有一个java程序,在这个程序中,我在一个循环中对SQLite数据库执行数千次查询。如果查询显示为空,则插入行。如果查询有结果,我将忽略。我通常以1000个批次执行这些单独的查询,但最终将有几十万个查询来完成此任务 因为我有数千行代码,我正在用单个查询进行检查,所以程序的这一部分运行得非常慢 有没有更有效的方法来执行这么多查询 下面是一个循环,它不断从excel文档中提取原始数据,直到读取所有信息:执行数千个查询的JavaSQLite,java,sqlite,Java,Sqlite,我有一个java程序,在这个程序中,我在一个循环中对SQLite数据库执行数千次查询。如果查询显示为空,则插入行。如果查询有结果,我将忽略。我通常以1000个批次执行这些单独的查询,但最终将有几十万个查询来完成此任务 因为我有数千行代码,我正在用单个查询进行检查,所以程序的这一部分运行得非常慢 有没有更有效的方法来执行这么多查询 下面是一个循环,它不断从excel文档中提取原始数据,直到读取所有信息: for(int i =0;i < batchSize;i++){ try {
for(int i =0;i < batchSize;i++){
try {
String[] rowReader=(dataRows.get(i));
archiveID=rowReader[16];
DIVA = rowReader[41];
//Check if already in DB. If it is not, then adds to a batch
System.out.println("checking db");
if(!isInDB(conn, archiveID, DIVA)){
stmt.setString(1,archiveID);
stmt.setString(2,DIVA);
stmt.setString(3,docName);
stmt.addBatch();
}
}catch (IndexOutOfBoundsException ex){
endOfDoc = true;
}
//dump to database every batchSize
if(++count % batchSize == 0) {
//System.out.println("executing batch");
stmt.executeBatch();
conn.commit();
count=0;
}
}
谢谢 您的isInDB方法每次都连接到数据库。你不需要它。您也可以通过一个查询来实现这一点
sqlQuery = "SELECT * FROM AllRecords WHERE "
for(int i =0;i < batchSize;i++){
...
if(i ==0)
sqlQuery + = "ArchiveID=\"" + archiveID +"\" AND DivaCat=\""+DIVA +"\"";
else
sqlQuery + = " OR ArchiveID=\"" + archiveID +"\" AND DivaCat=\""+DIVA +"\"";
sqlQuery=“从所有记录中选择*,其中”
对于(int i=0;i
然后执行sqlQuery查询并用rs结果检查您的每一行。您的isInDB方法每次都连接到数据库。您不需要它。您也可以通过一个查询来完成
sqlQuery = "SELECT * FROM AllRecords WHERE "
for(int i =0;i < batchSize;i++){
...
if(i ==0)
sqlQuery + = "ArchiveID=\"" + archiveID +"\" AND DivaCat=\""+DIVA +"\"";
else
sqlQuery + = " OR ArchiveID=\"" + archiveID +"\" AND DivaCat=\""+DIVA +"\"";
sqlQuery=“从所有记录中选择*,其中”
对于(int i=0;i
然后执行sqlQuery查询并用rs结果检查每一行。在没有任何索引的情况下,要找到所需的行,数据库需要在每次查询执行时遍历整个表 您可以通过索引两个查找列来优化此特定查询中的查找:
在所有记录上创建索引(ArchiveID、DivaCat);
在没有任何索引的情况下,要找到所需的行,数据库需要在每次查询执行时遍历整个表
您可以通过索引两个查找列来优化此特定查询中的查找:
在所有记录上创建索引(ArchiveID、DivaCat);
那么问题是什么?重用stmt
。你有索引吗?@VHS查询速度太慢,无法进行超过100000次的单独查询。我如何提高速度?@CL。我没有任何索引设置。那么问题是什么?重用stmt
。你有索引吗?@VHS查询速度太慢,无法进行超过100000次的单独查询。呵呵我可以加快速度吗?@CL.我没有任何索引设置。可能应该使用StringBuilder进行此操作可能应该使用StringBuilder进行此操作谢谢!速度大幅提升。谢谢!速度大幅提升。