我在我的项目中使用TableGenerator
,下面是相同的代码片段。
@GeneratedValue(strategy = GenerationType.TABLE, generator = " TableGenerator")
@GenericGenerator(name = "TableGenerator", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = {
@Parameter(name = "table_name", value = "TABLE_GENERATOR")}
我知道hibernate
将在内存中缓存给定实体的最小值和最大值,并更新TABLE_GENERATOR
中的最小值和最大值(让我们假设该值可能是50-100)。
但我不确定 JPA/Hibernate TableGenerator
在集群环境中的行为是什么,即会有多个 JVM,因此每个 JVM 中相同的缓存最小/最大值是多少JMV 以及表:TABLE_GENERATOR 中将更新哪些值。
最佳答案
个人没有在集群环境中使用过 TableGenerator,相信它应该可以工作,但因为您访问的是单个表,所以总是有可能出现并发或事务问题。
IMO 表生成的 key 仅在您无法使用序列号(大多数平台都支持)时才有意义,并且具有很多优点:
- 保证唯一性
- 在任何事务之外进行操作,因此不会出现锁定问题,也不会因回滚而重用数字
- 支持缓存值,因此每个线程或集群元素都可以获得一个可以使用的范围,并且保证是唯一的,如果缓存 25 个组,则线程 1 获取 1-25,线程 2 获取 26-50 等。等等
- 由 hibernate 支持
如果序列不是一个选项,这可能会起作用,但我不相信没有漏洞可以解决。
关于java - 集群环境中的 JPA TableGenerator 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36636218/