【问题标题】:which is better Java program or stored procedure for infinitely running queries对于无限运行的查询,哪个是更好的 Java 程序或存储过程
【发布时间】:2012-07-20 08:07:03
【问题描述】:

在 MySQL 环境中,有一个专用的 MySQL 服务器和一个专用的应用服务器,这样更好 -

一个。在连接到数据库服务器的应用服务器上运行无限的 java 代码,根据 join 获取一些记录,然后将它们插入到数据库中

-或-

b.在数据库上运行一个无限存储过程,该过程基于连接(选择)执行插入

在执行时间、数据库负载、内存需求和数据库继续处理其他插入/更新的能力方面需要答案

【问题讨论】:

  • 更新:我通过为我在联接操作中使用的表编写插入/更新触发器解决了我的问题。这样,我摆脱了连续轮询。我现在可以将数据(在 select..join 之后)插入到另一个表中,只要它到达我有兴趣从中读取的表中。我没有执行详尽的内存测试,但是在表中使用了数千个插入/更新的测试(其中写入了触发器),CPU 负载最小(

标签: java mysql performance stored-procedures infinite


【解决方案1】:

我不确定执行时间、数据库负载和内存要求,但根据我的经验,最好在业务层(而不是数据库)中完成所有逻辑工作。此外,存储过程在大型项目中的可扩展性较低且难以维护。所以我的选择是A。

【讨论】:

  • 请解释为什么存储过程的可扩展性较差?
  • ... 还有为什么更难维护?
【解决方案2】:

缺少一些信息,但我猜是这样的:

这些行显然不是以无限的速率出现的。

您很可能正在投票。也就是说,你在循环之间制造了某种sleep()

如果你不是 - 那么你应该知道在任何一种情况下你都可能在数据库服务器上施加高负载。

所以,假设会有 某种 睡眠(为简单起见,假设是 1 秒),事实证明 Java 代码和存储的例程代码。这是为什么呢?

  • 睡眠处于空闲状态。睡眠期间不会持有任何锁。
  • 您在 Java 代码中发出的任何查询都必须从例程代码中发出,反之亦然。
  • 您的代码没有太多(或根本没有)计算复杂性。您很可能会检查目标表中的一些 MAX(id),然后是 INSERT INTO ... SELECT ... FROM ... WHERE id > max_id_as_just_calculated,或类似的东西。

执行时间实际上可能有利于常规代码,因为您不需要在 MySQL 和 Java 之间来回传送结果集。此外,您可以在一个查询中只使用INSERT INTO ... SELECT FROM,而不是将结果集转换为 java 对象/原语,然后准备新的INSERT 查询,再转换回 MySQL 数据。

在数据库负载方面,我没有发现真正的区别,由于网络交付时间(可能仍持有锁的时间),例行程序方面也略有改善。

注意事项:

您将如何从 Java 调用此过程?它将无限期地运行。那你会专门为它写一个线程吗?

假设它崩溃了(某种错误)——需要能够重新执行它(没什么大不了的,只是一个需要考虑的问题)。

您可以通过event scheduler 执行它——这将解决上述许多问题:不是通过例程循环,而是让调度程序每X 秒调用一次。但是 - 再考虑一下锁。

我自己的偏好:我可能会使用 Java 代码,或者如果我愿意将此逻辑添加到 RDBMS,我会使用事件调度程序。

【讨论】:

    【解决方案3】:

    对于某些数据库,我会选择存储过程。为什么要转移关于数据库的数据以及除了数据库之外的数据。

    但是 - MySql 你不能在存储过程中拥有commitrollback 有点失败(恕我直言)。所以我认为 MySql 上下文中的无限存储过程不会按预期工作。

    【讨论】:

    • 有趣..从来没有想过这个。虽然我使用触发器解决了我的问题,但了解和记住这是一件好事。
    • 有兴趣知道 - Sybase 你可以有提交和回滚。
    • 我也相信数据库应该自我管理——即保持完整性。
    【解决方案4】:

    我不确定是否存在“无限运行的查询”之类的东西。也许您的意思是重复运行的查询。

    无论如何,作为一般规则,如果您可以避免在数据库和应用程序之间来回传输大量数据的开销,您将获得更好的吞吐量。另一方面,如果您尝试做的“事情”是计算密集型(而不是数据密集型),那么在应用程序中进行计算(在与数据库不同的机器上运行)将减少数据库负载。

    在执行时间、数据库负载、内存需求和数据库继续处理其他插入/更新的能力方面需要答案

    在一般情况下无法量化这些东西,但有明显的权衡:

    • 避免传输大量数据可降低网络负载和 CPU 负载(在数据库驱动程序中)。
    • 但是对数据库执行“所有操作”会增加数据库的负载。

    如何在实践中发挥作用将主要取决于实际用例的细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多