我正在从事一个项目,其中有许多只读操作(如select)是在准备好的语句的帮助下编写的,但其他操作是与Hibernate事务一起编写的。我知道事务的原因是,如果您对数据库进行多次修改,则可以防止某种故障。因此,如果一个失败,就会有事务回滚。但我不知道什么是只读操作的最佳用途:何时应该在Hibernate事务上使用准备好的语句,反之亦然?
准备好的语句和事务有不同的范围。
您应该使用准备好的语句来防止SQL注入,并使您的代码更具可读性、安全性和可重用性。
您使用事务来控制事务性(提交和回滚)、设置超时、隔离级别和锁定模式。
当然,必要时应同时使用两者。
也许你会发现这个链接很有用:
只读数据库访问的事务?
使用预准备语句相对于普通 mysqli 语句的优势是什么?
我不确定我是否同意使用原始JDBC PreparedStatement
进行只读SELECT
操作,并委托给Hibernate进行其他所有操作。Hibernate能够支持本机SQL查询以及只读操作。
在原始JDBC上使用Hibernate的最大原因之一是您可以参与使用开箱即用的第一级缓存支持。这对于只读操作非常有用,因为在只读操作中,您可能会发出多个select子句,这些子句可能需要加载相同的关系或实体。
此外,您还可以参与引入二级缓存提供程序。Ehcache或Infinispan是很好的缓存提供程序,它们允许Hibernate在本地存储查询缓存和实体缓存,从而实现更快的结果集处理。
除此之外,它还允许生成查询的所有代码更加一致。您始终与Hibernate交互,并选择是否使用原始本机SQL。您甚至可以摆脱本机 SQL,只使用 HQL/JPQL,从而使应用程序变得不那么依赖数据库并且更加不可知。