Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行数千个查询的JavaSQLite_Java_Sqlite - Fatal编程技术网

执行数千个查询的JavaSQLite

执行数千个查询的JavaSQLite,java,sqlite,Java,Sqlite,我有一个java程序,在这个程序中,我在一个循环中对SQLite数据库执行数千次查询。如果查询显示为空,则插入行。如果查询有结果,我将忽略。我通常以1000个批次执行这些单独的查询,但最终将有几十万个查询来完成此任务 因为我有数千行代码,我正在用单个查询进行检查,所以程序的这一部分运行得非常慢 有没有更有效的方法来执行这么多查询 下面是一个循环,它不断从excel文档中提取原始数据,直到读取所有信息: for(int i =0;i < batchSize;i++){ try {

我有一个java程序,在这个程序中,我在一个循环中对SQLite数据库执行数千次查询。如果查询显示为空,则插入行。如果查询有结果,我将忽略。我通常以1000个批次执行这些单独的查询,但最终将有几十万个查询来完成此任务

因为我有数千行代码,我正在用单个查询进行检查,所以程序的这一部分运行得非常慢

有没有更有效的方法来执行这么多查询

下面是一个循环,它不断从excel文档中提取原始数据,直到读取所有信息:

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进行此操作谢谢!速度大幅提升。谢谢!速度大幅提升。