Java hibernate默认使用PreparedStatement吗

Java hibernate默认使用PreparedStatement吗,java,performance,hibernate,jakarta-ee,Java,Performance,Hibernate,Jakarta Ee,“Hibernate总是使用PreparedStatement调用数据库”引用。 如果是,那么hibernate在哪里缓存编译的查询,DB驱动程序在哪里缓存它们 我读到了关于c3p0的报道。如果hibernate默认缓存PreparedStatement,那么c3p0中的hibernate.c3p0.max_语句有何用途。 如果hibernate在默认情况下不这样做,那么对于缓存准备好的语句,连接池是必需的 有人能澄清一下吗。缓存准备好的语句只在特定JDBC连接的范围内有意义。因此,只有当ORM

“Hibernate总是使用PreparedStatement调用数据库”引用。 如果是,那么hibernate在哪里缓存编译的查询,DB驱动程序在哪里缓存它们

我读到了关于c3p0的报道。如果hibernate默认缓存PreparedStatement,那么c3p0中的hibernate.c3p0.max_语句有何用途。 如果hibernate在默认情况下不这样做,那么对于缓存准备好的语句,连接池是必需的


有人能澄清一下吗。

缓存准备好的语句只在特定JDBC连接的范围内有意义。因此,只有当ORM层可以使用某种连接池时,才能从缓存准备好的语句中获得一些东西。否则,每次创建Hibernate会话时都会得到一个新的“物理”JDBC连接(通常效率不高)。在没有任何连接池的情况下,缓存准备好的语句只在单个JDBC连接/Hibernate会话的范围内有用。这是因为在没有任何连接池的情况下,“物理”连接实际上是关闭的,不会被重用——相反,每当需要时,总是使用数据库驱动程序创建一个新连接

您需要考虑的另一件事是,单个JDBC连接上的开放准备语句的数量是有限的(据我所知,限制取决于供应商,并且在驱动程序实现之间有所不同)。因此,在池连接场景中,池实现可能需要知道每个池的“物理”底层JDBC连接上可以维护多少OpenPrepared语句。很可能实现了“准备最少的语句首先关闭”的策略,但这纯粹是我的猜测

我希望这有点道理。每当我提到“物理”JDBC连接时,我指的是一个到数据库的新TCP/IP连接。连接池获得的连接通常会修饰/包装“物理”连接

编辑以更直接地回答您的问题:

Hibernate最有可能使用和缓存PreparedStatements(这是非常基本的JDBC优化)。问题是这种缓存是否发生在由“物理”或池提供的JDBC连接创建的语句上。在没有池缓存的情况下,PreparedStatements只优化应用程序执行中在特定Hibernate会话范围内使用特定PreparedStatement两次的部分。对于池,相同的PreparedStatement将(有效地)在许多Hibernate会话实例中使用,这些实例恰好使用相同的底层“物理”连接


hibernate配置的属性hibernate.c3p0.max_语句很可能会配置C3PO池实例(我很确定它是自动为您创建的),而此配置与“物理”JDBC连接中的开放准备语句数量受限有关

“总是使用
PreparedStatement
”并不意味着“总是缓存
PreparedStatement
s”“-它们还提供参数插值。既然你一开始就在乞求这个问题,那么剩下的问题就来自这个错误的假设,毫无意义。您当然可以查找
hibernate.c3p0.max_语句的文档。连接池可以在内部维护每个连接语句的缓存,而根本不涉及Hibernate。不知道c3p0是否能做到这一点,但他们同样也有文档。你真好,一个简洁的解释。PreparedStatement是否可以通过条件或在hibernate中保存/更新/保存或更新来实现?我希望hibernate生成的每个SQL语句都可以准备好,然后执行。总之,是的。缓存发生在连接和池级别(通过缓存连接),但hibernate没有自己的查询缓存吗?查询缓存也称为二级缓存(第一级缓存是hibernate会话)缓存实体(查询结果)。这里的讨论是关于缓存准备好的语句。缓存准备好的语句和执行准备好的语句时生成的结果无关。jdbc4支持在驱动程序级别根据