【问题标题】:java jdbc design pattern : handle many insertsjava jdbc设计模式:处理许多插入
【发布时间】:2012-05-06 02:14:14
【问题描述】:

我想就我的问题寻求一些建议。 我有一个批处理可以进行一些计算(多线程环境)并在表中进行一些插入。 我想做一些像批量插入这样的事情,这意味着一旦我得到一个查询,等待有 1000 个查询,然后执行批量插入(不是一个一个地做)。

我想知道这是否有任何设计模式。 我有一个解决方案,但有点复杂:

  • 构建一个接收查询的方法

  • 将它们添加到列表(字符串和/或语句)

  • 在列表有 1000 个项目之前不要执行

问题:我该如何处理结尾? 我的意思是,最后的 999 个查询,我什么时候执行它们,因为我永远不会达到 1000 ? 我该怎么办 ?

我正在考虑每 5 分钟唤醒一次并检查列表中项目数的线程。如果他两次醒来并且数字相同,则执行现有查询。

有人有更好的主意吗?

【问题讨论】:

    标签: java mysql multithreading jdbc batch-insert


    【解决方案1】:

    向该 API 添加 commit 类型的方法,该 API 将被调用以确认已添加所有项目。此外,最佳批量大小在 20-50 范围内。在那之后,潜在收益被越来越多的报表所需的簿记所抵消。您没有明确提及它,但您当然必须使用 JDBC 中的专用批处理 API。

    如果你需要跟踪许多作者,每个作者都在自己的线程中,那么你还需要一个 begin 类型的方法,你可以计算它被调用的次数,与 @987654323 的次数相比@ 被称为。像引用计数之类的东西。当你达到零时,你知道你可以刷新你的语句缓冲区。

    【讨论】:

      【解决方案2】:

      您的数据库驱动程序需要支持批量插入。 See this.

      您是否确定您的系统因服务和数据库之间的通信过多而阻塞网络流量?如果没有,我不会担心批处理,直到你确定你需要它。

      您在计划中提到您希望每 5 分钟检查一次。那是永恒。如果您要在 5 分钟内获得 1000 个项目,则不需要批处理。大约是每秒 3 次。

      假设您确实想要批处理,让进程每 2 秒唤醒一次并提交排队的任何内容。不要等五分钟。它可能会提交 0 行,也可能会提交 10 行……谁在乎……使用这种方法,您不必担心没有达到您的任意阈值。

      我假设插件一次插入一个。如果您的传入数据一次进入 n ,我将提交每个传入请求,无论发生多少插入。如果您的消息是作为某种消息系统传入的,那么它无论如何都是异步的,因此您不必担心批处理。在高负载下,传入的消息只是等到有能力处理它们。

      【讨论】:

      • 对不起,我忘了提。我正在使用 MySQL 数据库。
      • dev.mysql.com/doc/refman/5.5/en/insert.html。您可以编写自己的批量插入。我认为 jbdc 驱动程序应该为您处理它。
      • hvgotcodes 你的想法不错:每 2 秒提交一次,而不是每 x 个项目提交一次。
      • @CC.你的系统在使用 JMS 吗?
      • 我不知道细节,所以我可能是错的,但我会使用 JMS 而不是本地线程。 JMS 更具容错性,可以为您解决此类问题。此外,它还具有可扩展性和简单性。
      【解决方案3】:

      这是最令人惊奇的概念,我遇到过很多次。因此,根据您的问题,您正在创建一个批次,并且该批次有 1000 个或更多的 insert 查询。但是,如果您以重复的方式插入到同一个表中。

      为避免这种情况,您可以像这样进行插入查询:-

      INSERT INTO table1 VALUES('4','India'),('5','Odisha'),('6','Bhubaneswar')

      它只能对多个值执行一次。因此,最好将所有值保留在任何集合元素(arraylist、list 等)中,最后像上面一样进行查询并插入一次。

      您也可以使用 SQL 事务 API。(Commit,rollback,setTraction()) 等。

      希望对你有所帮助。 一切顺利。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        相关资源
        最近更新 更多