Asp.Net核心身份+EF核心+蟑螂Db=非常慢



我想使用带有Asp.Net核心标识的CockratchDb。Cockratch使用Postgres的wire协议,因此Npgsql.EntityFrameworkCore.PostgreSQL包也适用于Cockratch。

简单地添加所有必要的服务、生成迁移并应用它是行不通的,因为生成的迁移使用NpgsqlValueGenerationStrategy.IdentityByDefaultColumn,这会导致列中的generated BY DEFAULT AS IDENTITY不受Cockratch的支持。因此,我在所有生成的迁移文件(迁移、设计器、模型快照(中将NpgsqlValueGenerationStrategy更改为SerialColumn。此更改后,应用迁移可以工作,但在调用UserManager.AddClaim时会出现另一个错误。溢出异常。所以我认为这是因为默认情况下,Cockratch for SERIAL列不使用序列,而是根据当前时间戳和节点id生成唯一的数字,这会产生一些非常巨大的数字。蟑螂提供了一种通过执行SET experimental_serial_normalization = sql_sequence来覆盖当前会话的SERIAL关键字行为的方法。因此,我删除了所有的表,并再次应用迁移,但在此之前,我向AppDbContext的构造函数添加了执行上述命令的代码。在应用迁移后,可以删除此代码,因为不再需要它了。

做所有这些事情可以使Identity与CockroachDb一起工作,但速度非常慢。创建新用户大约需要4秒。添加新的索赔-大致相同。与PostgreSQL的约1秒相比。

将EF Core与Identity之外的蟑螂一起使用是缓慢的,但并非毫无道理。但将EF Core和蟑螂与Identity结合使用会使性能变得不可接受。

问题出在哪里?也许为了让《身份》与《蟑螂》合作而改变所有这些事情会以某种方式把它搞砸?功能方面一切正常。

ASPNET标识将允许您使用GUID作为Id。如果您只是更改它,其余部分将不会出现任何问题,并将相应地执行

sql_sequence设置预计会较慢,因为它在集群中的不同节点之间添加了大量协调,以确保序列增量增加一个。

以下是此功能的发行说明摘录。

CockratchDB现在支持PostgreSQL处理SERIAL和序列的两种实验性兼容性模式,以便于重用为PostgreSQL开发的第三方框架或应用程序。这些模式可以通过experimental_serial_normalization会话变量(每个客户端(和sql.defaults.serial_normaalization集群设置(集群范围(启用。第一种模式virtual_sequence能够与许多使用SERIAL的应用程序兼容,并具有最大的性能和可扩展性。第二种模式sql_sequence实现了PostgreSQL的最大兼容性,但使用常规sql序列,因此受到性能限制。

我认为理想的情况是不使用sql_sequence,并且应该进行修复,这样生成的数字就不会溢出。这可以通过以下两种方式之一解决:

  • 驱动程序可以支持SERIAL类型的64位整数
  • 将蟑螂数据库default_int_size集群设置或会话变量设置为4

最新更新