提问者:小点点

JDBC 预准备语句与Hibernate会话事务只读操作


我正在从事一个项目,其中有许多只读操作(如select)是在准备好的语句的帮助下编写的,但其他操作是与Hibernate事务一起编写的。我知道事务的原因是,如果您对数据库进行多次修改,则可以防止某种故障。因此,如果一个失败,就会有事务回滚。但我不知道什么是只读操作的最佳用途:何时应该在Hibernate事务上使用准备好的语句,反之亦然?


共2个答案

匿名用户

准备好的语句和事务有不同的范围。

您应该使用准备好的语句来防止SQL注入,并使您的代码更具可读性、安全性和可重用性。

您使用事务来控制事务性(提交和回滚)、设置超时、隔离级别和锁定模式。

当然,必要时应同时使用两者。

也许你会发现这个链接很有用:

只读数据库访问的事务?

使用预准备语句相对于普通 mysqli 语句的优势是什么?

匿名用户

我不确定我是否同意使用原始JDBC PreparedStatement进行只读SELECT操作,并委托给Hibernate进行其他所有操作。Hibernate能够支持本机SQL查询以及只读操作。

在原始JDBC上使用Hibernate的最大原因之一是您可以参与使用开箱即用的第一级缓存支持。这对于只读操作非常有用,因为在只读操作中,您可能会发出多个select子句,这些子句可能需要加载相同的关系或实体。

此外,您还可以参与引入二级缓存提供程序。Ehcache或Infinispan是很好的缓存提供程序,它们允许Hibernate在本地存储查询缓存和实体缓存,从而实现更快的结果集处理。

除此之外,它还允许生成查询的所有代码更加一致。您始终与Hibernate交互,并选择是否使用原始本机SQL。您甚至可以摆脱本机 SQL,只使用 HQL/JPQL,从而使应用程序变得不那么依赖数据库并且更加不可知。