我刚刚完成了citusdb教程。和本地使用" psql"工作良好。但是,当我尝试使用本机postgres jdbc执行相同的查询时,我收到错误:
ERROR: ERROR: cannot execute PREPARE for a distributed query plan
Query = SELECT count(*) FROM customer_reviews
本地工作正常,
postgres=# SELECT count(*) FROM customer_reviews;
589859 (1排)
答案 0 :(得分:2)
引用CitusDB的Wiki上的Common Errors页面。
此错误的最常见原因是默认情况下使用ODBC / JDBC驱动程序的工具会尝试使用PREPARE语句,目前CitusDB不支持该语句。通过降级JDBC或ODBC协议版本可以很容易地解决这个问题,以避免使用PREPARE语句。
对于ODBC驱动程序,根据您使用的特定驱动程序/工具,有时会选择禁用PREPARE语句。或者,您可以将协议恢复到版本7.2,这几乎总是可行的。
对于JDBC驱动程序,确切的步骤更多地依赖于特定的驱动程序。但是,您几乎总是可以在驱动程序属性中将protocolVersion设置为2,或者在连接字符串中指定它。
答案 1 :(得分:1)
PgJDBC使用服务器端预处理语句,看起来这个“citusdb”工具不支持它们。
尝试setting the prepare threshold,因此PgJDBC不会尝试准备陈述;见setPrepareThreshold
。如果我没记错的话,您可以在JDBC URL中使用p repareThreshold=0
进行设置,但这会影响所有连接。
答案 2 :(得分:1)
我也遇到了与JDBC集成的CitusDB相同的问题,但是有一个解决方案。
您已为协议版本提供连接字符串,例如
connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres?protocolVersion=2");
目前,CitusDB JDBC仅适用于协议版本2.
我得到了结果,希望它能解决你的问题。
答案 3 :(得分:0)
我正在使用JDBC使用RazorSQL查询工具。但我改为ODBC,现在正在工作。