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

问题描述

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

在服务器端我使用 Postgresql,在客户端我使用 sqlite。 在代码中,我使用相同的 Ormlite 方法,而不关心管理的 DB(Postgresqlsqlite)。

让我们说:

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

我正在寻找一种方法来一步插入所有项目,所以要快点,不要长时间锁定数据库。我知道它应该是一种存储过程(我不是专家......)。

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

谢谢

解决方法

我正在寻找一种方法来一步插入所有项目,所以要快点,不要长时间锁定数据库。

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

我明白它应该是一种存储过程...

我根本看不出存储过程对您有什么帮助。它们不是魔法。

但现在项目越来越多,这可能不是最好的方法,也是因为我长时间锁定数据库。

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

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

希望这里有帮助。

,

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

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