繁体   English   中英

通过Java在PostgreSQL中一次执行单个查询还是多个查询之间的区别

[英]Difference between executing a single vs multiple queries at a time in PostgreSQL through Java

我正在尝试连接到Postgres数据库并执行.sql文件中的一些查询。 我有两种方法

  1. 一次从.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); 
  2. 读取整个.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM