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

时间:2015-10-08 06:29:40

标签: java sql postgresql

我正在尝试连接到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;
    
  3. 我想知道这两种方式之间的区别。有没有其他方法可以做到这一点,因为我的SQL文件有1000个sql语句

1 个答案:

答案 0 :(得分:0)

PgJDBC拆分语句客户端并将它们分别发送到服务器。

它的SQL解析器并不是超级明亮的。特别是,上次我查看它并不支持$$引用。它刚刚在最新版本的驱动程序中被重写,所以这可能只是改进了。

我不会立即回想起它如何处理来自多语句execute(...)的结果集 - 它是否丢弃除最后一个结果集之外的所有结果集,或者它是否将它们作为多个{{1}可访问的结果集累加起来就像使用Statement.getMoreResults()时一样。快速测试程序应该确认。

我也不能立即记住它是否在每个声明之间发送executeBatch(),即强制往返。您可以通过检查启用了调试日志记录的PgJDBC调试日志来检查,也可以通过Wireshark检查,后者知道如何解码PostgreSQL协议。

理想情况下,我们所拥有的将是PgJDBC中的扩展接口,它可以为您解析SQL脚本并按语句运行它,返回的结果相当于将其作为批处理运行。 Sync或其他什么。没有人想要足够实现它。

目前,我建议将其逐个语句拆分并运行它,至少对于大型脚本而言。或者提交一个补丁来向PgJDBC添加PGConnection.runScript(...)功能当然......随时欢迎补丁;)