存储过程与JDO的数据仓库项目

时间:2010-01-27 12:50:08

标签: java stored-procedures java-ee data-warehouse jdo

在过去,我们曾经通过存储过程访问数据库。他们被视为管理数据的“更好”方式。我们将数据保存在数据库中,任何语言/平台都可以通过JDBC / ODBC /等访问它。

然而,近年来,基于运行时反射/元数据的存储检索机制如Hibernate / DataNucleus已经变得流行。最初我们担心由于所涉及的额外步骤(反射很昂贵)以及当我们需要的是一个字段时它们如何检索不必要的数据(整个对象)它们会很慢。

我开始计划使用J2EE的大型数据仓库项目,但我不确定是要使用存储过程还是JDO / JPA等。最近,我一直在使用Hibernate,说实话,我不会错过编写CRUD存储过程!

它基本归结为:

存储过程
+可以在服务器上进行优化(尽管只有查询)
- 每个表可能有超过一千个存储过程:add,delete,update,getById等。

JDO
+我将不会在接下来的几个月内编写参数.add(“@ firstNames”,customer.getFirstName()); ...
- 比SP慢(但大多数支持分页)

在我的情况下,你会有什么好处。在这种情况下,我认为这是一个很大的问题。

谢谢,

约翰

3 个答案:

答案 0 :(得分:2)

“JDO - 将比SP慢(但大多数支持分页)”

这种假设通常是错误的。 SP没有理由特别快。我做了一些测量,但它们并不比数据库外的代码快。

数据仓库的特点是仅插入加载和长时间运行的SELECT...GROUP BY...查询。

您没有编写OLTP事务处理。您没有使用3NF作为防止更新/删除事务更新异常的方法。

由于您正在进行批量插入,因此SP肯定会比批量装入实用程序慢。批量加载器通常是多线程的,并且将消耗所有可用的CPU资源。 SP是数据库的一部分,只能共享有限的数据库资源。

由于你大部分都在做SELECT GROUP BY,所以SP在这里也无济于事。 SELECT语句不会被包含在过程中。

你不需要它们。他们没有帮助。

您可以轻松地对批量加载和查询进行基准测试,以证明SP没有帮助。

答案 1 :(得分:1)

Rod Johnson在他的“J2EE Design adn Development”中写了一篇关于ORM / StoredProcedures的非常清晰的分析。他说那个

  

存储过程只应在J2EE系统中使用,以执行始终大量使用数据库的操作,无论它们是在数据库中实现还是在与数据库交换大量数据的Java代码中实现。

当您计划实施数据仓库时,我认为存储过程方法是正确的选择。

答案 2 :(得分:0)

我建议使用元数据生成用于加载到数据仓库的脚本。这使您可以通过使用专门的加载工具以及可能来自存储过程(如果您使用的是足够古老的数据库)获得性能优势。此外,您可能最终手动编码至少一些SQL。将通用脚本作为存储过程完成将允许您以相同的方式安排所有脚本,而不必担心在重写某些生成的代码时更改它们的调用方式,以使其运行得更好。

至于获取数据,如果你在J2EE中构建的是一个报告工具,那么你可能最好使用JDO。虽然我对报告方面并不十分熟悉,但我能看到的一个好处是,允许最终用户提前做出您没有预料到的自定义报告会更容易(尽管您仍然需要他们可以做什么的一些限制,以便他们不会在过程中删除数据库)。