Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate,最有效的id生成策略是什么?_Java_Mysql_Performance_Hibernate_Id Generation - Fatal编程技术网

Java Hibernate,最有效的id生成策略是什么?

Java Hibernate,最有效的id生成策略是什么?,java,mysql,performance,hibernate,id-generation,Java,Mysql,Performance,Hibernate,Id Generation,我需要通过Hibernate将许多实体插入数据库。所以,我想找到最有效的Id生成算法 因此存在四种广泛使用的发电策略: 身份 序列 桌子 自动的 我应该使用MySQL数据库,所以我不能应用序列生成策略。其他策略呢?从性能角度看,什么是最有效的?由于您不能使用序列,而自动只是从现有的生成器算法中自动选择一个受支持的生成器算法,因此您只需使用标识和表 TABLE:使用hi/lo算法有效地生成long、short或int类型的标识符,给定一个表和列作为hi值的源。hi/lo算法生成仅对特定数据库

我需要通过Hibernate将许多实体插入数据库。所以,我想找到最有效的Id生成算法

因此存在四种广泛使用的发电策略:

  • 身份
  • 序列
  • 桌子
  • 自动的

我应该使用MySQL数据库,所以我不能应用序列生成策略。其他策略呢?从性能角度看,什么是最有效的?

由于您不能使用
序列
,而
自动
只是从现有的生成器算法中自动选择一个受支持的生成器算法,因此您只需使用
标识

  • TABLE
    :使用hi/lo算法有效地生成long、short或int类型的标识符,给定一个表和列作为hi值的源。hi/lo算法生成仅对特定数据库唯一的标识符。->表示每个生成实体的额外查询。(如果使用优化器,则情况并非如此。不幸的是,如果未指定优化器,则通常默认情况下不使用优化器。)

  • IDENTITY
    :支持DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL中的IDENTITY列。->性能方面,这是一种方法,与正常情况下没有休眠时的方法相同。数据库生成,几乎没有开销


Hibernate中有更多特定于Hibernate的生成器,但它们在性能上不会超过数据库生成的ID。(请参阅链接文档中的各种附加生成器)。

Hibernate中最好的ID生成器是增强的表和增强的序列,再加上适当的优化器,如hilo。我有使用增强型table+hilo的经验,每秒插入超过10000条记录


顺便说一句,“hilo需要对每个生成的实体进行额外的查询”的说法显然是错误的:优化器的全部目的是防止这一点。

我对Hibernate一无所知,但为什么MySQL可以自动生成ID呢?关于优化器,你是对的。我没有意识到它们,而我的回答集中在基本的生成器上。带有优化器的增强生成器解决了这些缺点。但您确实提到了hi/lo:在早期版本的Hibernate中,它与基本的id生成策略并没有很好地分离,但它仍然提供了相同的关键优势:减少了id管理选择的数量。IDENTITY还要求每个插入的实体都有一个额外的查询,为了得到生成的ID,这是不可优化的,这与表策略相反。如果您的DMB支持在insert语句中检索ID,则不会有第二次往返(例如MS SQL Server)。有这么多的差异,在引擎盖下,你必须照顾到回答时。。。