【问题标题】:Is it possible with PostgresSQL JDBC to force usage of client only Prepared Statements?PostgresQL JDBC 是否可以强制使用仅客户端准备好的语句?
【发布时间】:2020-06-06 22:38:34
【问题描述】:

我想在不更改代码的情况下消除 PGSQL 上的服务器端准备语句。这在 JDBC 上是否可以通过某些参数实现?

明确地说,我想使用 Client Prepared Statements,这意味着我的代码不会改变,我将享受 Prepared Statements 的安全优势,但不会在服务器上编译它。

【问题讨论】:

    标签: java sql postgresql jdbc prepared-statement


    【解决方案1】:

    The documentation 说:

    在某些情况下,您可能希望禁用服务器准备的语句。例如,如果您通过与服务器准备的语句不兼容的平衡器路由连接,则您别无选择。

    您可以通过设置 prepareThreshold=0 来禁用服务器端准备好的语句

    代码示例:

    java.sql.PreparedStatement pstmt = conn.prepareStatement("SELECT ...");
    // get the PostgreSQL-specific class
    org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
    // disable server-side prepared statements
    pgstmt.setPrepareThreshold(0);
    

    如果您在java.sql.Connectionunwrap org.postgresql.PGConnection,您还可以为该连接上的所有准备好的语句设置连接级别的阈值。

    将其添加到 URL 的示例:jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true&prepareThreshold=0

    【讨论】:

    • 看起来不错!它会在连接字符串上工作吗?还是只在 PreparedStatement 对象上?
    • 其实这并不能编译。 PreparedStatement 对象没有 setPrepareThreshold 方法:-(
    • 我修正了遗漏并添加了一些内容来覆盖连接级别的设置。
    • 是的,因为您需要转换 Connection,而不是 PreparedStatement,如下所示: (org.postgresql.PGConnection)conn.setPrepareThreshold(0);在 Eclipse 中无异议地工作。
    猜你喜欢
    • 2012-04-26
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多