JDBC准备语句vs hibernate会话事务readonly操作

时间:2017-01-30 15:22:24

标签: java hibernate jdbc transactions prepared-statement

我正在开发一个项目,在这个项目中有很多只读操作(比如在select中),这些操作是在预准备语句的帮助下编写的,但其他操作都是使用hibernate事务。 我知道交易的原因是因为如果对数据库进行多次修改,则会出现一些故障。因此,如果一个失败,则存在事务回滚。 但我不知道什么是最好用于readonly操作:什么时候我应该在hibernate事务上使用预准备语句,反之亦然?

2 个答案:

答案 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,从而使应用程序变得更少依赖数据库,更加不可知。