【问题标题】:How to write several item in table at the same time using ORMLite如何使用 ORMLite 同时在表中写入多个项目
【发布时间】:2021-05-27 02:18:30
【问题描述】:

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

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

让我们这么说:

  • 表A对应A类
  • 我有一个对象 A 的 Arraylist
  • 我想在 DB 中插入 ArrayList 的所有项。

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

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

需要注意的是,有些项目可能是新的(即它已经不存在具有相同主键id的项目),那么必须执行和INSERT;其他项目可能已存在,因此应执行 UPDATE。

谢谢

【问题讨论】:

    标签: java postgresql sqlite ormlite java-stored-procedures


    【解决方案1】:

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

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

    我知道它应该是一种存储过程......

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

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

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

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

    希望这里有所帮助。

    【讨论】:

    • 非常感谢 Gray,我会研究你的解决方案并应用它。
    【解决方案2】:

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

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

    【讨论】:

    • 您好,感谢您的回复,我正在查看 Google,但我不知道 ORMLite Java 是否可以使用此功能。以防万一,您建议使用哪个库(文件 .jar)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多