代码之家  ›  专栏  ›  技术社区  ›  mattsmith5

Java JOOQ与准备好的语句

  •  0
  • mattsmith5  · 技术社区  · 5 年前

    我正在将JOOQ与Microsoft SQL Server 2019一起使用。在该参考文献中,

    https://www.jooq.org/doc/3.0/manual/sql-execution/performance-considerations/

    呈现SQL字符串需要一些时间。在内部,jOOQ重用 与完整查询的java.lang.StringBuilder相同,但有些 渲染元素可能会花费它们的时间。当然,你可以缓存 由jOOQ生成的SQL,并准备您自己的java.SQL。准备的报表 物体

    我正在阅读有关Java Prepared语句的资源 Prepared SQL 这句话对我来说没有意义, You could, of course, cache SQL generated by jOOQ and prepare your own java.sql.PreparedStatement objects 。使用PreparedStatement不是只是添加了另一种语言,并减少了JOOQ的类型/字符串安全的全部目的吗?JOOQ如何与Prepared语句一起使用?对此有代码解释吗?尝试使用此策略编写代码。

    String sql = "select * from people where id=?";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setLong(123);
    

    Does jooq has any performance lead over simple sql in java

    0 回复  |  直到 5 年前
        1
  •  1
  •   Lukas Eder    5 年前

    如链接文档页面中所述(“明智地优化”)和我的 previous answer ,你可能不应该担心这些事情——当然不是先验的。

    为了回答您的问题,您可以从任何jOOQ查询中提取SQL字符串并绑定值,如下所示:

    String sql = query.getSQL();
    List<Object> binds = query.getBindValues();
    

    然后对它们执行任何您喜欢的操作,包括缓存值和准备自己的语句,而不是直接使用jOOQ执行查询。

    但同样,正如链接页面中所否认的那样,你不应该提前担心任何此类开销。例如,当对内存中几乎没有数据的H2数据库运行10000个相同的琐碎查询时,SQL字符串生成的开销是可以测量的,但当通过网络对具有真实工作负载的远程SQL Server运行普通查询时,则无法测量。

    此外,使用这种方法,您将放弃jOOQ在执行查询时提供的许多不错的功能( e.g. the new MULTISET operator )