[英]Difference between executing a single vs multiple queries at a time in PostgreSQL through Java
我正在尝试连接到Postgres数据库并执行.sql
文件中的一些查询。 我有两种方法
一次从.sql
文件读取一个查询并执行它。
Connection con = DriverManager.getConnection(url,userName,password); LOGGER.info("Connection established"); ScriptRunner sr = new ScriptRunner(con); Reader reader = new BufferedReader( new FileReader(sqlPath)); LOGGER.info("Running the script file"); sr.runScript(reader);
读取整个.sql
文件,并将其附加到字符串缓冲区,然后同时执行所有语句。
public boolean executeDBScripts(String aSQLScriptFilePath, Statement stmt) throws IOException,SQLException { boolean isScriptExecuted = false; try { BufferedReader in = new BufferedReader(new FileReader(aSQLScriptFilePath)); String str; StringBuffer sb = new StringBuffer(); while ((str = in.readLine()) != null) { sb.append(str + "\\n "); } in.close(); stmt.executeUpdate(sb.toString()); isScriptExecuted = true; } catch (Exception e) { System.err.println("Failed to Execute" + aSQLScriptFilePath +". The error is"+ e.getMessage()); } return isScriptExecuted;
我想知道这两种方法之间的区别。是否有其他方法可以执行,因为我的SQL文件中有1000条sql语句
PgJDBC在客户端拆分语句,并将其分别分发到服务器。
它的SQL解析器不是超级亮。 特别是,上次我检查它不支持$$
报价。 它只是在最新版本的驱动程序中被重写,因此可能已经有所改善。
我不会立即回想起它如何处理多语句execute(...)
结果集-是否丢弃除最后一个结果集以外的所有结果,或者是否将它们累积为多个Statement.getMoreResults()
集,可通过Statement.getMoreResults()
访问,例如executeBatch()
被使用。 快速测试程序应确认这一点。
我也无法立即记住它是否在每个语句之间发送Sync
,即强制往返。 您可以通过启用调试日志记录的方式检查PgJDBC的调试日志,也可以通过Wireshark(它知道如何解码PostgreSQL协议)进行检查。
理想情况下,我们将拥有的是PgJDBC中的扩展接口,该接口可以为您解析SQL脚本并逐条语句运行它,返回的结果等于批量运行它。 PGConnection.runScript(...)
或其他。 没人想要足够的东西来实施它。
就目前而言,我建议至少针对大型脚本,按语句将其拆分并运行。 或者提交补丁以将runScript
功能添加到PgJDBC中……当然,总是欢迎使用补丁;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.