在过去,我们曾经通过存储过程访问数据库。他们被视为管理数据的“更好”方式。我们将数据保存在数据库中,任何语言/平台都可以通过JDBC / ODBC /等访问它。
然而,近年来,基于运行时反射/元数据的存储检索机制如Hibernate / DataNucleus已经变得流行。最初我们担心由于所涉及的额外步骤(反射很昂贵)以及当我们需要的是一个字段时它们如何检索不必要的数据(整个对象)它们会很慢。
我开始计划使用J2EE的大型数据仓库项目,但我不确定是要使用存储过程还是JDO / JPA等。最近,我一直在使用Hibernate,说实话,我不会错过编写CRUD存储过程!
它基本归结为:
存储过程
+可以在服务器上进行优化(尽管只有查询)
- 每个表可能有超过一千个存储过程:add,delete,update,getById等。
JDO
+我将不会在接下来的几个月内编写参数.add(“@ firstNames”,customer.getFirstName()); ...
- 比SP慢(但大多数支持分页)
在我的情况下,你会有什么好处。在这种情况下,我认为这是一个很大的问题。
谢谢,
约翰
答案 0 :(得分:2)
“JDO - 将比SP慢(但大多数支持分页)”
这种假设通常是错误的。 SP没有理由特别快。我做了一些测量,但它们并不比数据库外的代码快。
数据仓库的特点是仅插入加载和长时间运行的SELECT...GROUP BY...
查询。
您没有编写OLTP事务处理。您没有使用3NF作为防止更新/删除事务更新异常的方法。
由于您正在进行批量插入,因此SP肯定会比批量装入实用程序慢。批量加载器通常是多线程的,并且将消耗所有可用的CPU资源。 SP是数据库的一部分,只能共享有限的数据库资源。
由于你大部分都在做SELECT GROUP BY
,所以SP在这里也无济于事。 SELECT语句不会被包含在过程中。
你不需要它们。他们没有帮助。
您可以轻松地对批量加载和查询进行基准测试,以证明SP没有帮助。
答案 1 :(得分:1)
存储过程只应在J2EE系统中使用,以执行始终大量使用数据库的操作,无论它们是在数据库中实现还是在与数据库交换大量数据的Java代码中实现。
当您计划实施数据仓库时,我认为存储过程方法是正确的选择。
答案 2 :(得分:0)
我建议使用元数据生成用于加载到数据仓库的脚本。这使您可以通过使用专门的加载工具以及可能来自存储过程(如果您使用的是足够古老的数据库)获得性能优势。此外,您可能最终手动编码至少一些SQL。将通用脚本作为存储过程完成将允许您以相同的方式安排所有脚本,而不必担心在重写某些生成的代码时更改它们的调用方式,以使其运行得更好。
至于获取数据,如果你在J2EE中构建的是一个报告工具,那么你可能最好使用JDO。虽然我对报告方面并不十分熟悉,但我能看到的一个好处是,允许最终用户提前做出您没有预料到的自定义报告会更容易(尽管您仍然需要他们可以做什么的一些限制,以便他们不会在过程中删除数据库)。