Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 我的SQL PreparedStatement有什么问题?_Java_Sql_Performance_Prepared Statement - Fatal编程技术网

Java 我的SQL PreparedStatement有什么问题?

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

我从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; 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次查询。我以为是大量的记录被读取会加快速度,但似乎不是这样。