Java 我的SQL PreparedStatement有什么问题?
我从Access数据库的三个表中读取了大量数据,大约200万行,可能是100MB的文本。 我使用了以下SELECT语句:Java 我的SQL PreparedStatement有什么问题?,java,sql,performance,prepared-statement,Java,Sql,Performance,Prepared Statement,我从Access数据库的三个表中读取了大量数据,大约200万行,可能是100MB的文本。 我使用了以下SELECT语句: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + databaseLocation + databaseName +";selectMethod=cursor; READ
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);
String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = " + county_ID;
Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery(SQL);
这需要一段时间(大约2分钟),所以我想办法加快速度。
我读了一些准备好的声明,决定试着做一个。以下是我编写的各种教程:
String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = ?";
PreparedStatement prest = con.prepareStatement(SQL);
prest.setString(1, county_ID);
ResultSet result = prest.executeQuery();
它仍然有效,但现在需要超过15分钟。我有一个很好的谷歌,但我似乎无法发现我做错了什么。PreparedStatement是否不适合我的特定问题?当您要多次执行同一查询时,使用PreparedStatement会带来主要的性能提升。数据库在准备语句时构造查询,然后在每次执行语句时重新使用查询以避免开销。如果只执行一次查询,那么使用PreparedStatement可能不会提高性能
使用PreparedStatement的主要理由是防止SQL注入如果直接在数据库上运行查询,需要多长时间?我没有具体的建议,但我建议您研究如何获得更好的JDBC驱动程序。@JamesB几乎没有时间。不到一秒钟。如果从URL中删除selectMethod、readonly和type参数会发生什么情况?@Aaron Kurtzhals我不完全确定这意味着什么。我的印象是,有一个JDBC:ODBC驱动程序专门用于从Java访问。还有什么替代方案?编辑:哦,孩子。。。好了,现在我们来看一下,看起来有很多不同的。你能从我的代码中看出我在用哪一个吗?或者我怎么知道?很有趣。看来我误解了。我认为每次检索记录时都会执行“查询”,在本例中,这是非常多次的。如果实际上这只是查询的一次执行,那么我可以理解为什么它没有更快。@Russell如果在循环中多次执行它,那么您希望在循环外创建PreparedStatement,然后在循环内调用
PreparedStatement.setString()
和PreparedStatement.executeQuery()
,如图所示。这就是你在做的吗?@Edd我恐怕我只是误解了你使用预先准备好的声明的目的。我只执行了25次查询。我以为是大量的记录被读取会加快速度,但似乎不是这样。