嗨,我有我想从表中选择数据,如果没有找到过检查下一个值等再次产生新的价值,并插入到数据库,然后循环统计数据的应用程序。 这将做的时间十亿左右为一个新的请求。
所以,我应该使用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
)
我假设/希望around a billion times
是一个比喻,因为如果不是这样,那是肯定有不少的操作,所以你可能要重新检查设计。
话虽这么说,作为你的第一个问题,我会建议休眠,因为它基本上是建立在JDBC之上,并提供了一些更简便的事情,如让你编写独立于数据库的查询,这意味着你不需要重新编写查询你应该改变你的数据库。
根据你的第二个问题,这真的取决于你想要做什么:
根据这个API:
saveOrUpdate
无效saveOrUpdate(Object对象)抛出HibernateException的
要么保存(对象)或更新(Object)将给定的实例,这取决于未保存值检查的分辨率(参见未保存的值检查讨论中的手册)。 此操作级联到关联的实例,如果所述关联映射与级联=“保存更新”。
参数:对象 - 包含新的或更新状态的瞬态或分离实例抛出:HibernateException的另请参见:保存(java.lang.Object中),更新(Object对象)
救
救
序列化的保存(Object对象)抛出HibernateException的
持续给定的瞬态的实例中,首先分配一个生成的标识符。 (或者使用所述标识符属性的当前值,如果使用所分配的发电机。)如果关联与级联=“保存更新”映射此操作级联到关联的实例。 参数:object - 一个持久类返回的瞬态的实例:所产生的标识符抛出:HibernateException的
根据你的第三个问题,你应该提供更多的信息。 你也能设置值,以避免编写null
值到您的数据库,但这真的取决于你的申请,并在其将要实施的背景下。
Hibernate是一个OR映射工具 。 简单的说,它客体化在应用程序中的数据层 ,这样你就不必处理与数据库交互的复杂性。
现在话说回来,存在这样的情况,其中,休眠可能不是很好的选择。
如果你的模式是非常简单的 (小于8-10表),并没有它们之间非常复杂的关系,则Hibernate使用将是这种情况略有矫枉过正。
如果数据的你在想工作的尺寸非常大(MN / BN的顺序),也有Hibernate使用中的使用是不鼓励。 好老JDBC是在这里更好
如果应用程序使用了大量的静态数据 ,那么缓存将是一个不错的选择,透明的休眠支持缓存。
所以,这一切都取决于你有什么类型的场景。 您可以随时建立saveOrUpdate(obj);
使用JDBC为好。
1) So should i use hibernate or simple JDBC ??
如果你知道你的方式围绕冬眠我会说去了,如果你有足够的时间和资源来学习它,否则只能使用它。 事实是,如果你使用它好,它可以是你最好的朋友,否则只会是痛苦的根源。
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).
第三个问题我真的不明白,请展开它。
由于大部分的您的问题上面已经回答了,让我来回答你的最后一个问题。 是的,你必须创建一个新的对象,每一个新的对象(理想情况下,如果没有相关的依赖)将在数据库新行。 所以,你必须创建一个新的对象 - >设定值给它 - >其与Hibernate的Session关联 - >和db.If保存它,你都希望在数据库中插入不同的行那么是的,你必须创建不同的对象。
希望这可以帮助。
还要注意的Hibernate的地毯下技术方面的问题。
- 它建立反射模式调用性能(无论是getter和setter或字段
- 休眠反正生成SQL查询,并从读出的数据集的数据,然后,以分配所查询的超时值调用反射方法。
- 如果您填写这是一个密钥 - Hibernate会首先把它用于查询形成任何财产(但一次操作)
所以,休眠加载和持久对象时,确实至少额外操作每日两次。 Really-它更多。 因此,一旦你使用的工作与功能,不worklflow模式下的数据库,你可以读取数据集的数据(Hibernate会做同样的),并保存在本地变量。 具有可变的工作比对象使用查找表更快。
然而,一个环境:任何JPA类映射到表。 这是件好事,一旦你从头开始,或者如果数据库中有合适的设计建立自己的数据库。 如果你需要从数合并域O表? 然而,Hibernate有@OneToOne注释插入和对象对应于另一个表。 然而一旦Hibernate会做工作的周期为一到一个链接对象,当你只需要几个字段。
在nutshell-计算操作如果性能是最终的标准:你必须和至少需要2次调用数据集。 Hibernate是重工作流操作,当你有因为好处:
- 你很多次,从数据集读取对象的字段不
- 这是更好地释放数据集是比任何数据对象重得多