我正在尝试连接到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语句
答案 0 :(得分:0)
PgJDBC拆分语句客户端并将它们分别发送到服务器。
它的SQL解析器并不是超级明亮的。特别是,上次我查看它并不支持$$
引用。它刚刚在最新版本的驱动程序中被重写,所以这可能只是改进了。
我不会立即回想起它如何处理来自多语句execute(...)
的结果集 - 它是否丢弃除最后一个结果集之外的所有结果集,或者它是否将它们作为多个{{1}可访问的结果集累加起来就像使用Statement.getMoreResults()
时一样。快速测试程序应该确认。
我也不能立即记住它是否在每个声明之间发送executeBatch()
,即强制往返。您可以通过检查启用了调试日志记录的PgJDBC调试日志来检查,也可以通过Wireshark检查,后者知道如何解码PostgreSQL协议。
理想情况下,我们所拥有的将是PgJDBC中的扩展接口,它可以为您解析SQL脚本并按语句运行它,返回的结果相当于将其作为批处理运行。 Sync
或其他什么。没有人想要足够实现它。
目前,我建议将其逐个语句拆分并运行它,至少对于大型脚本而言。或者提交一个补丁来向PgJDBC添加PGConnection.runScript(...)
功能当然......随时欢迎补丁;)