是否使用休眠?
Posted
技术标签:
【中文标题】是否使用休眠?【英文标题】:Use Hibernate or not? 【发布时间】:2012-05-21 08:48:43 【问题描述】:您好,我有一个应用程序,我想从表中选择数据,如果找不到,则生成新值并插入数据库,然后再次循环统计检查下一个值等等。对于一个新请求,这将完成大约十亿次。
那么我应该使用hibernate
还是简单的JDBC
??
我应该在休眠状态下使用
session.saveOrUpdate(obj);
或
session.save(obj);
还有一件事我想问的是,对于每个插入,我是否必须初始化我的表类对象(new Mytable
)?只设置值就行了?
喜欢
MyTable obj=new Mytable();
obj.setName("dasd");
obj.set...
obj.save();
或者我可以只初始化一次吗
`MyTable obj=new Mytable();`
and in a loop put
for(...
obj.setName("dasda");
obj.save
)
【问题讨论】:
也许这个博客可以帮助你。 codingandmore.blogspot.com/2010/01/… 【参考方案1】:Hibernate 是一个OR Mapping tool。简而言之,它在您的应用程序中对象化数据层,这样您就不必处理复杂的数据库交互。
话虽如此,但在某些情况下,休眠可能不是好的选择。
如果您架构非常简单(少于 8-10 个表)并且它们之间没有非常复杂的关系,那么在这种情况下使用 hibernate 会有点矫枉过正。
如果您尝试处理的 数据大小 非常大(按 mn/bn 的顺序),那么不鼓励使用 hibernate。好的旧 JDBC 在这里更好
如果您的应用程序使用大量 静态数据,那么 缓存 将是一个不错的选择,并且 hibernate 透明地支持缓存。
所以这一切都取决于你有什么类型的场景。您也可以随时使用 JDBC 构建 saveOrUpdate(obj);
。
【讨论】:
【参考方案2】:我假设/希望 around a billion times
是一个比喻,因为如果不是,那肯定有很多操作,所以您可能需要重新检查您的设计。
话虽如此,至于您的第一个问题,我推荐 Hibernate,因为它基本上构建在 JDBC 之上,并为您提供了一些更方便的东西,例如让您编写独立于数据库的查询,这意味着您不需要重新如果您更改数据库,请编写查询。
根据你的第二个问题,这真的取决于你想做什么:
根据这个 API:
saveOrUpdate
void saveOrUpdate(Object object) 抛出 HibernateException
保存(对象)或更新(对象)给定的实例,取决于解决方案 未保存值检查(有关未保存值的讨论,请参阅手册 检查)。此操作级联到关联的实例,如果 关联与 cascade="save-update" 映射。
参数:object - 一个包含 new 的瞬态或分离实例 或更新状态抛出:HibernateException 另见: 保存(java.lang.Object),更新(对象对象)
save
保存
可序列化保存(对象对象) 抛出 HibernateException
持久化给定的瞬态实例,首先分配一个生成的 标识符。 (或者使用标识符属性的当前值,如果 使用分配的生成器。)此操作级联到关联 如果关联使用 cascade="save-update" 映射,则为实例。 参数: object - 持久类的瞬态实例 返回:生成的标识符 抛出:HibernateException
根据您的第三个问题,您应该提供更多信息。您可以设置值以避免将 null
值写入数据库,但这实际上取决于您的应用程序以及将在其中实现它的上下文。
【讨论】:
问题已经更新,saveOrUpdate是不是保存得更快了? @Dennis:我认为save
应该更快,因为它不进行任何检查,但是,如果您尝试保存数据库中已经存在的内容可能会导致一些异常并处理它们可能首先使用saveOrUpdate
会更耗时。
@Dennis 看到你问我同样的问题,正准备给你同样的答案:)【参考方案3】:
1) So should i use hibernate or simple JDBC ??
如果您知道如何使用 hibernate,我会建议您使用它,否则只有在您有足够的时间和资源来学习它时才使用它。事实是,如果你用得好,它可以成为你最好的朋友,否则它只会成为痛苦的源泉。
2) and in hibernate should i use
session.saveOrUpdate(obj);
or
session.save(obj);
对于这个问题,您可能需要阅读找到的 JavaDoc here。一个sn-p:
save(Object object)
Persist the given transient instance, first assigning a generated identifier.
和
saveOrUpdate(Object object)
Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).
第三个问题我不太明白,请展开。
【讨论】:
问题已经更新,saveOrUpdate是不是保存得更快了?【参考方案4】:上面已经回答了您的大部分问题,让我回答您的最后一个问题。是的,您必须创建一个新对象,每个新对象(理想情况下,如果没有关联的依赖项)将是 db.xml 中的一个新行。因此,您必须创建一个新对象-->为其设置值-->将其与休眠会话关联-->并将其保存在数据库中。如果您想在数据库中插入不同的行,那么是的,您必须创建不同的对象。
希望这会有所帮助。
【讨论】:
【参考方案5】:还要注意 Hibernate 的底层技术方面。
-
它构建反射模式来调用属性(getter 和 setter 或字段)
Hibernate 无论如何都会生成 SQL 查询并从数据集中读取数据,然后调用反射方法以分配查询出来的值。
如果您填写了任何作为键的属性 - Hibernate 将首先将其用于查询形成(还有一个操作)
因此,hibernate 至少会执行两次附加操作——在加载和持久化对象时。真的 - 它做得更多。 因此,一旦您在功能性而非工作流模式下使用数据库,您就可以从数据集中读取数据(Hibernate 也会这样做)并将其保存在局部变量中。使用变量比使用对象查找表更快。
还有一种情况:任何 JPA 都将一个类映射到表。很好,一旦您从头开始构建数据库或者数据库具有合适的设计。如果您需要合并 o 表中的字段怎么办?然而,Hibernate 有 @OneToOne 注释来插入和对应于另一个表的对象。然而,一旦 Hibernate 将为一对一链接对象执行循环工作,而您只需要几个字段。
简而言之,如果性能是最终标准,则计算操作:您必须且至少需要 2 次调用数据集。 Hibernate 用于繁重的工作流操作,当您因为以下原因而受益时:
-
您多次从对象而非数据集中读取字段
最好发布比任何数据对象都重的数据集
【讨论】:
以上是关于是否使用休眠?的主要内容,如果未能解决你的问题,请参考以下文章