我正在开发一个项目,在这个项目中有很多只读操作(比如在select中),这些操作是在预准备语句的帮助下编写的,但其他操作都是使用hibernate事务。 我知道交易的原因是因为如果对数据库进行多次修改,则会出现一些故障。因此,如果一个失败,则存在事务回滚。 但我不知道什么是最好用于readonly操作:什么时候我应该在hibernate事务上使用预准备语句,反之亦然?
答案 0 :(得分:1)
准备好的陈述和交易有不同的范围。
您应该使用预准备语句来阻止SQL注入,并使您的代码更具可读性,安全性和可重用性。
您使用事务来控制事务性(提交和回滚),设置超时,隔离级别和锁定模式。
当然,你应该在必要时使用两者。
也许你觉得这个链接很有用:
Transactions for read-only DB access?
Advantages of using prepared statements over normal mysqli statements?
答案 1 :(得分:0)
我不完全确定我同意将原始JDBC PreparedStatement
用于只读SELECT
操作,并将其委托给Hibernate用于其他所有操作。 Hibernate能够支持本机SQL查询和只读操作。
在原始JDBC上使用Hibernate的最大原因之一是您可以参与使用开箱即用的第一级缓存支持。即使对于只读操作,您也可以发出多个可能需要加载相同关系或实体的select子句。
此外,您还可以参与介绍二级缓存提供程序。 Ehcache或Infinispan是很好的缓存提供程序,允许Hibernate在本地存储查询缓存和实体缓存,从而实现更快的结果集处理。
除此之外,它还允许生成查询的所有代码更加一致。您始终与Hibernate交互并选择是否使用原始本机SQL。您甚至可以放弃原生SQL,只使用HQL / JPQL,从而使应用程序变得更少依赖数据库,更加不可知。