我正在将我的项目升级到使用 Hibernate 5.3.18 的 Spring Boot 2.1.18。
以前,我的实体看起来像这样,并且会使用 SequenceHiLoGenerator:
@Entity
@Table(name = "group_link")
@SequenceGenerator(name = "group_link_seq", sequenceName = "group_link_seq")
public class GroupLinkEntity extends BaseObject {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "group_link_seq")
@Column(name = "group_link_id", unique = true, nullable = false)
private Long id
}
Run Code Online (Sandbox Code Playgroud)
现在,默认情况下,在 Hibernate 5 中,它使用 SequenceStyleGenerator,这会导致约束冲突,因为我的增量大小为 1,默认的 allocateSize 为 50。
为了保持兼容性,建议设置此属性:
spring.jpa.properties.hibernate.use-new-id-generator-mappings: false
Run Code Online (Sandbox Code Playgroud)
我这样做了,但似乎不需要,因为仍然使用 SequenceStyleGenerator。根据我的理解,这应该会导致它使用 SequenceHiLoGenerator。这是不正确的吗?
但是,如果我将实体修改为如下所示,它将按预期工作,复制我之前拥有的功能。
@Entity
@Table(name = "group_link")
@GenericGenerator(
name = "group_link_seq",
strategy = "org.hibernate.id.SequenceHiLoGenerator",
parameters = {
@Parameter(name = "sequence_name", value = …Run Code Online (Sandbox Code Playgroud) hibernate hilo sequence-generators spring-boot hibernate-5.x
问题:
我需要实现多个共享序列生成器,将被 50-100 个 Tomcat 服务器使用。每个序列生成器应从 1 开始,并在每次请求后加 1。序列生成器实现应该有原子增量命令。Java 客户端应该可用。
规模:
多达 50000 个序列生成器被积极使用,对于它们中的每一个,我们预计在 5-10 秒内有一个增量请求。每秒最多 20000 个请求
50-100 个 java 客户端(Tomcat 服务器)。对序列生成器的访问在这些服务器之间共享。重要提示:只有 2 个客户端使用相同的序列生成器。
50-100 次 - 每个序列生成器的平均使用次数。
24 小时 TTL - 生成器最多应在创建后 24 小时后清理 - 因此实际上可能有超过 50000 个序列生成器,但预计最多只能有 50000 个同时主动接收请求。
性能:
<1ms 更可取的平均响应时间。平均超过 2ms 肯定不够好。
我们排除了 Oracle 的 Sequence 对象。
我们目前正在考虑 Redis 和 Memcached。
两者都很快。
推荐/足够好的实现是什么?
是否有其他更好的技术用于此目的?
另一个重要问题:
incr、Redis 或 Memcached 哪个性能更好?
谢谢
有关更新的问题:
假设我有2个处理生成器函数:
def gen1(): # just for examples,
yield 1 # yields actually carry
yield 2 # different computation weight
yield 3 # in my case
def gen2():
yield 4
yield 5
yield 6
Run Code Online (Sandbox Code Playgroud)
我可以用itertools链接它们
from itertools import chain
mix = chain(gen1(), gen2())
Run Code Online (Sandbox Code Playgroud)
然后我可以用它创建另一个生成器函数对象,
def mix_yield():
for item in mix:
yield item
Run Code Online (Sandbox Code Playgroud)
或者只是如果我只是想next(mix),它就在那里。
我的问题是,我该如何做异步代码中的等效代码?
因为我需要它来:
next迭代器上一页 更新:
经过实验和研究后,我发现aiostream库声明为itertools的异步版本,因此我做了什么:
import asyncio
from aiostream import stream
async def gen1():
await asyncio.sleep(0)
yield 1
await …Run Code Online (Sandbox Code Playgroud) python asynchronous sequence-generators python-3.x python-asyncio
我有两个值是:
firstval=200.000
Secondval=399.999,
Run Code Online (Sandbox Code Playgroud)
我必须生成一个数字,这样当第一个小数部分应该递增直到999整数部分时,接下来整数部分应该递增,然后小数部分重置为000并开始为新数字递增。这会发生直到399. 喜欢
200.001,200.002.....200.999,201.000,201.002....399.998,399.999"
顺序应该是这样的.
AZ,AA-AZ,BA-BZ,CA-CZ,.......,ZA-ZZ
在ZZ之后它应该从AAA开始.
然后是AAA到ZZZ再到AAAA到ZZZZ等等.
这个序列非常类似于Excel表格.
编辑:添加了我的代码
private void SequenceGenerator()
{
var numAlpha = new Regex("(?<Numeric>[0-9]*)(?<Alpha>[a-zA-Z]*)");
var match = numAlpha.Match(txtBNo.Text);
var alpha = match.Groups["Alpha"].Value;
var num = Convert.ToInt32(match.Groups["Numeric"].Value);
lastChar = alpha.Substring(alpha.Length - 1);
if (lastChar=="Z")
{
lastChar = "A";
txtBNo.Text = num.ToString() + "A" + alpha.Substring(0, alpha.Length - 1) + lastChar;
}
else
{
txtBNo.Text = num.ToString() + alpha.Substring(0, alpha.Length - 1) + Convert.ToChar(Convert.ToInt32(Convert.ToChar(lastChar)) + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所做的.但是,我知道这是错误的逻辑. …
java ×2
alphabetical ×1
asynchronous ×1
c# ×1
hibernate ×1
hilo ×1
memcached ×1
python ×1
python-3.x ×1
redis ×1
sequence ×1
sequences ×1
sequencing ×1
spring-boot ×1