如何使用 ORMLite 同时在 table 中写入多个项目

How to write several item in table at the same time using ORMLite

我在服务器和客户端制作的解决方案上使用 ORMLite。

在服务器端我使用 PostgreSql,在客户端我使用 SQLite。 在代码中,我使用相同的 ORMLite 方法,而不考虑管理的数据库(PostgreSql 或 SQLite)。

假设:

今天我使用 for() 循环,我将它们一个接一个地插入(在事务管理器中执行)。 项目少的时候没问题,但是现在项目越来越多,这可能不是最好的方法,也因为我长时间锁定数据库。

我正在寻找一种一次性插入所有项目的方法,以便快速进行,而不是长时间锁定数据库。我理解它应该是一种存储过程(我不是专家......)。

需要注意的是,有些项目可能是新的(即不存在具有相同主键id的项目),则必须执行INSERT;其他项目可能存在,因此应该执行更新。

谢谢

您可以使用 entityManager.merge([list of items]); entityManager 将一次性插入列表。

合并 如果数据库中不存在则创建对象,如果已经存在则更新。

I'm searching a way to insert all the items in one step, so to go quickly, to not lock the DB for long time.

所以我知道有两种方法可以做到这一点:交易和禁用自动提交。如果您要插入数据库并且从一致性的角度来看它需要“立即”发生,那么事务是唯一的方法。如果你只想插入和更新大量性能更高的记录,那么你可以禁用自动提交,进行操作,然后提交。根据数据库的实现,这就是 TransactionManager 真正做的事情。

I understood that it should be a sort of Stored Procedures...

我完全看不出存储过程对您有何帮助。它们不是魔法。

but now the items are becoming more and this is not probably the best way, also because I lock the DB for long time.

我认为对此没有灵丹妙药。如果您将大量对象推送到数据库并且您需要数据是事务性的,那么在更新期间必须持有锁。要意识到的一件事是 postgres 应该比 Sqlite 更好地处理这个问题。 Sqlite 没有(我认为没有)行级锁定,这意味着整个数据库在事务期间暂停。 Postgres 有一个 much 更成熟的锁定系统,在这种情况下应该更高效。这也是为什么 Sqlite 在许多其他操作中如此快的原因,因为它不必承受锁的复杂性。

需要考虑的一件事是重新构建架构。尝试找出需要以事务方式插入的最小数据量。例如,可能只需要事务性地更改对象关系,但所有 data 都可以稍后存储。例如,您可以有一个 AccountOwner 对象,它只有 2 个 ID,而有关 Account 的所有信息都可以存储在事务之外。这会使您的架构更复杂,但可能会更快。

希望这里的内容有所帮助。