这是用于无限运行查询的更好的Java程序或存储过程

时间:2012-07-21 05:08:40

标签: java mysql performance stored-procedures infinite

在MySQL环境中,使用专用的MySQL服务器和专用的应用服务器,这更好 -

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

-OR -

湾在数据库上运行无限存储过程,该过程基于join(select)执行插入

需要回答执行时间,数据库负载,内存要求以及数据库继续处理其他插入/更新的能力

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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中,我会使用事件调度程序。

答案 2 :(得分:1)

我不确定是否存在“无限运行查询”这样的问题。也许您的意思是一个重复运行的查询。

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

  

需要回答执行时间,数据库负载,内存要求以及数据库继续处理其他插入/更新的能力

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

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

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

答案 3 :(得分:1)

对于某些数据库,我会选择存储过程。为什么在数据库之外移动数据以及有关数据的知识。

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

相关问题