从Java调用用于MS Access的SQL命令第一次非常慢,并且在后续运行中更快

时间:2012-07-18 12:23:43

标签: 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 (*.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();

我尝试使用准备好的声明,但我不确定我做得对。

存储数据后,我关闭ResultSet:

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。

有没有人知道为什么它第一次变慢(或更多为什么它在后续运行中更快)? 另外,有什么一般的事情我可以做得更好,使它更快?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

你说200万行,但数据有多大?它很可能是第一次从磁盘读取它,然后它在磁盘缓存中用于后续运行。即使整个数据集不能同时存在于RAM中,关键数据结构仍可能存在。