2

嗨,我有一个应用程序,我想从表中选择数据,如果找不到,则生成新值并插入数据库,然后再次循环统计检查下一个值等等。对于一个新请求,这将完成大约十亿次。

那么我应该使用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

)
4

5 回答 5

7
  1. Hibernate 是一个OR 映射工具。简单来说,它使应用程序中的数据层对象化,这样您就不必处理复杂的数据库交互。

  2. 话虽如此,在某些情况下,休眠可能不是好的选择。

  3. 如果您的模式非常简单(少于 8-10 个表)并且它们之间没有非常复杂的关系,那么在这种情况下使用 hibernate 会稍微有点矫枉过正。

  4. 如果您尝试处理的数据量非常大(按 mn/bn 的顺序),则不鼓励过度使用 hibernate。好的旧 JDBC 在这里更好

  5. 如果您的应用程序使用大量静态数据,那么缓存将是一个不错的选择,并且 hibernate 透明地支持缓存。

所以这一切都取决于你有什么类型的场景。您也可以始终saveOrUpdate(obj);使用 JDBC 进行构建。

于 2012-05-21T09:03:38.083 回答
2

我假设/希望这around a billion times是一个比喻,因为如果不是,那肯定有很多操作,所以你可能想重新检查你的设计。

话虽如此,至于您的第一个问题,我会推荐 Hibernate,因为它基本上建立在 JDBC 之上,并为您提供了一些更方便的东西,例如让您编写独立于数据库的查询,这意味着您不需要重新编写查询如果你改变你的数据库。

根据您的第二个问题,这实际上取决于您想要做什么:

根据这个API:

保存或更新

void saveOrUpdate(Object object) 抛出 HibernateException

save(Object) 或 update(Object) 给定实例,取决于未保存值检查的解决方案(有关未保存值检查的讨论,请参阅手册)。如果关联映射为 cascade="save-update",则此操作级联到关联实例。

参数: object - 包含新状态或更新状态的瞬态或分离实例抛出:HibernateException 另请参见:save(java.lang.Object)、update(Object object)

节省

节省

可序列化保存(对象对象)抛出 HibernateException

持久化给定的瞬态实例,首先分配一个生成的标识符。(或者如果使用分配的生成器,则使用标识符属性的当前值。)如果关联映射为 cascade="save-update",则此操作级联到关联实例。参数:object - 持久类的瞬态实例返回:生成的标识符抛出:HibernateException

根据您的第三个问题,您应该提供更多信息。您可以设置值以避免将null值写入数据库,但这实际上取决于您的应用程序以及将在其中实现它的上下文。

于 2012-05-21T09:03:09.393 回答
1

As most of your questions has been answered above, let me answer your last question. Yes, you have to create a new object, each new object (ideally, if there is no associated dependency) will be a new row in db. So, you have to create a new object-->set values to it--> associate it with hibernate session--> and saves it in db.If you have want to insert different rows in db then yes, you have to create different objects.

Hope this helps.

于 2012-05-22T06:44:50.640 回答
1
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 。一个片段:

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).

第三个问题我不太明白,请展开。

于 2012-05-21T08:59:39.783 回答
1

还要注意 Hibernate 的底层技术方面。

  1. 它构建反射模式来调用属性(getter 和 setter 或字段)
  2. Hibernate 无论如何都会生成 SQL 查询并从数据集中读取数据,然后调用反射方法以分配查询出的值。
  3. 如果您填写了任何作为键的属性 - Hibernate 将首先将其用于查询形成(还有一个操作)

因此,hibernate 至少会执行两次附加操作——在加载和持久化对象时。真的 - 它做得更多。因此,一旦您在功能性而非工作流模式下使用数据库,您就可以从数据集中读取数据(Hibernate 也会这样做)并将其保存在局部变量中。使用变量比使用对象查找表更快。

还有一种情况:任何 JPA 都将一个类映射到表。很好,一旦您从头开始构建数据库或者数据库具有合适的设计。如果您需要合并 o 表中的字段怎么办?然而,Hibernate 有 @OneToOne 注释来插入和对应于另一个表的对象。然而,一旦 Hibernate 将为一对一链接对象执行循环工作,而您只需要几个字段。

简而言之,如果性能是最终标准,则计算操作:您必须且至少需要 2 次调用数据集。Hibernate 用于繁重的工作流操作,当您因为以下原因而受益时:

  1. 您多次从对象而不是从数据集中读取字段
  2. 最好发布比任何数据对象都重的数据集
于 2015-10-28T17:38:12.573 回答