Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
从Java调用用于MS Access的SQL命令在第一次时非常慢,在后续运行时要快得多_Java_Sql_Performance_Connection - Fatal编程技术网

从Java调用用于MS Access的SQL命令在第一次时非常慢,在后续运行时要快得多

从Java调用用于MS Access的SQL命令在第一次时非常慢,在后续运行时要快得多,java,sql,performance,connection,Java,Sql,Performance,Connection,我正在用jdbc:odbc桥连接Access数据库。 然后,我从数据库中选择了大量数据~200万行。 我在重新启动后第一次运行代码时速度非常慢,检索数据需要6分钟以上。 在后续运行中,只需1.5分钟即可完成相同的操作 这是我用来连接数据库的代码: try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Driver={Microsoft Access Driver (

我正在用jdbc:odbc桥连接Access数据库。 然后,我从数据库中选择了大量数据~200万行。 我在重新启动后第一次运行代码时速度非常慢,检索数据需要6分钟以上。 在后续运行中,只需1.5分钟即可完成相同的操作

这是我用来连接数据库的代码:

try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + databaseLocation + databaseName + ";selectMethod=cursor; READONLY=true; TYPE=FASTLOAD";

        con = DriverManager.getConnection(url);

        System.out.println("Connected to " + databaseName);

        } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());   
        } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
    }
在谷歌搜索了很多之后,我尝试添加一些参数,比如

selectMethod=cursor
READONLY=true
TYPE=FASTLOAD
就我所知,这些都没有什么不同

然后,我选择如下所示的数据:

String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, TLANDS.NAME, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY FROM ((ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID) LEFT JOIN TLANDS ON BUILDINGS.TLAND_ID = TLANDS.TLAND_ID WHERE BUILDINGS.COUNTY_ID = " + county_ID;

    PreparedStatement prest = con.prepareStatement(SQL);

    ResultSet result = prest.executeQuery();
我试着使用事先准备好的声明,但我不确定我是否做对了

存储数据后,我关闭结果集:

result.close();
在程序的后面,我将按如下方式关闭连接:

try{
        stmt.close();
        con.close();
        System.out.println("Connection to " + databaseName + " closed");
    } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString()); 
    }
不幸的是,我现在致力于使用Java和Access

有人知道为什么第一次跑得慢,或者为什么以后跑得快吗? 还有,有什么一般的事情我可以做得更好,使它更快


谢谢您的时间。

您说有200万行,但数据有多大?很有可能它是第一次从磁盘读取所有数据,然后在磁盘缓存中进行后续运行。即使整个数据集不能立即放入RAM,关键数据结构也可能仍然存在。

几乎任何数据库第一次都会变慢。但这是为什么?如果我正确地关闭了与数据库的连接,那么它肯定必须从头开始。数据是否仍以某种方式保存在RAM中?除了建立缓存之外,还有很多其他事情在幕后进行,比如评估计划和其他活动,这些活动会使后续运行更快。有趣。Access数据库的大小约为1GB。不过,我并没有以任何方式阅读全部内容。我真的不知道如何估计我实际获取的数据的大小。大概10%。