4

我正在重新设计一对应用程序,它们在一种情况下使用Hibernate ,在第二种情况下使用Hibernate 和 Java Content Repository(特别是JackRabbit)的组合。

重新架构的一个关键问题是提高性能,所以我想知道为应用程序的设计和开发引入DBA是否有任何价值。

请注意,我并没有质疑让 DBA 参与管理生产数据库的价值。但在过去的项目中,必须让优秀的 DBA 参与设计和编码阶段,找出优化数据结构的方法,将代码放入存储过程等。

但鉴于数据库结构几乎完全由 Hibernate 和 JackRabbit 管理,因此优化它们的空间不大。当然,如果我们发现它们表现不佳,DBA 可能会发现问题,我们可以提交补丁来改进它们,但我不知道我们是否希望(或能够)在应用程序方面做很多事情——具体调优。

想知道 DBA 在这类应用程序中的角色的另一个原因是,我们的大部分性能问题很可能在持久层之上,即不是数据库、hibernate 或 JackRabbit 太慢,而是这样我们已经构建了我们的数据并推动它不是很好。解决这个问题将涉及数据建模,但实现媒介是 XML 文件和 Java 代码,而不是数据库表和 SQL。DBA 通常对这类事情了解很多吗?

使我无法完全排除在设计和开发基于持久层之上的应用程序时对 DBA 的需求的原因是怀疑。我不太相信通过使用预打包的解决方案可以完全消除对特定应用程序进行数据库优化的需求。

我错过了关键点吗?熟练的 DBA 是否可以调整休眠配置文件以使我的应用程序的特定用例变得异常快速?在没有 DBA 手动调整数据库本身、构建索引等的情况下考虑运行高负载 Hibernate 应用程序是不是很疯狂?或者开发领域中是否有专门优化基于 XML 的数据模型和抽象持久层的新生物?

4

5 回答 5

7

有DBA,也有DBA。一些 DBA 是管理员——备份、恢复、授予、撤销——一类的人。保持灯亮。基础的。

其他 DBA 是建筑师/设计师。“解决这个问题将涉及数据建模” 这就是第二层 DBA应该做的事情。

许多管理员 DBA 被推入架构师角色——毕竟他们知道 SQL——但并不真正适合它。你知道你找错人了,当...

  1. 他们痴迷于表和列的命名约定。

  2. 他们痴迷于 FK/PK 关系,而忽略了这样一个事实:一旦您获取了行并将它们制成对象,您就有许多丰富、复杂的集合类可用于管理关系。

  3. 他们不能将表中的行与应用程序中的对象以及两者都是实现的现实世界实体分开。这通常可能是一个表演障碍。如果您有一个复杂的现实世界对象,该对象由复杂的编程语言结构实现并且还映射到复杂的数据库结构,那么它可能会令人困惑。有些人退回到他们的舒适区并开始重复无意义的短语,例如“这一切都只是位”或“最终,一切都是 FK,甚至是对象引用”。

  4. 要求一切都是存储过程,“因为它更快”。如果他们不能提供证据,情况会更糟。

这就是重点...

性能取决于两件事:数据结构和算法。通过选择正确的数据结构和算法来最小化资源使用(I/O、内存等)。

数据库非规范化是一种调整数据结构以匹配算法的方法。其他性能调优基本上是相同的概念:更改参数和选项以使数据结构更好地匹配应用程序算法。

应该是双向的。您应该查看您的实体、您的需求,并制定出正确数据结构和算法。完成此操作后,您可以调整缓冲区的大小等等,以获得更好的性能。

从根本上说,超快的速度来自于考虑最内层最内层的循环:它们在循环什么?他们在寻找什么?如何用不循环或根本不循环的东西替换它们?

如果您的 DBA 可以参与算法和数据结构设计,那么它们就是一种资产,请大量使用它们。

如果您的 DBA 不能参与,请不要将您的设计限制在他们喜欢的范围内。

于 2008-10-09T13:18:40.863 回答
3

在没有 DBA 手动调整数据库本身、构建索引等的情况下考虑运行高负载 Hibernate 应用程序是不是很疯狂?

是的,因为(AFAIK)Hibernate 不对数据库进行任何优化,因为这些东西总是依赖于工作负载。

要解决您更大的问题:当然,您需要一个善于调整数据库以提高性能的人,是的,使用休眠确实会改变所需的技能。

于 2008-10-09T13:06:50.827 回答
2

Hibernate可以控制数据库结构。这并不意味着hibernate应该控制它们。

如果您有一个包含大量数据且性能至关重要的大型应用程序,我可能不会使用自动生成的表定义。我想要一个完全优化的数据库结构,然后编写 Hibernate 映射来使用它。如果你有一个稍微懂开发的 DBA,他们甚至可以编写 HQL 或自定义 SQL 来让事情变得更好。

(我从来没有用过 JackRabbit,所以我不能在那里发表评论)

此外,DBA 可能会在测试期间帮助您解决性能问题。

于 2008-10-09T13:18:09.197 回答
0

我想说这取决于您的应用程序 - 您仍然可以使用 Hibernate 进行本机查询 - 所以这取决于是否存在任何可能存在并需要调整的查询。同样,它取决于所需的性能 - 如果有任何性能关键部分,您可能需要支持来确定是什么减慢了该部分的速度。还有一些数据库只需要比其他数据库更多的管理员(Oracle ...)

于 2008-10-09T13:10:18.777 回答
0

我同意大卫。更糟糕的是:使用持久层的开发人员应该具有良好的数据库知识,以了解为什么他们的某些调用非常耗时以及如何找到解决方法。

于 2008-10-09T13:13:20.250 回答