在遗留世界中需要休眠 [已关闭]

2022-09-03 16:48:30

我有几个关于休眠的问题。

在stackoverflow中的许多问题中,有几个人说休眠对于非常复杂的数据库来说不是一个好的选择。如果我们有非常复杂的数据库,休眠就不是正确的选择。它更适合绿地项目,但对于复杂的遗留数据库来说就不那么好了。

  1. 这是真的吗?
    此外,休眠会生成查询。每个项目经理都希望有优化的查询(休眠不能比sql专家生成更多的优化查询!因此,对于大型项目,聘请sql专家不是问题。sql专家将优化查询(使用解释sql,使用连接...

  2. 我的问题是,为什么一个庞大而昂贵的项目不关心sql优化?
    (你会说你可以写HQL,但正如我在很多帖子中看到的那样,这些帖子解释说HQL不如sql强大,很多程序员都会头痛并经过几个小时的调整)(你喜欢你体内的所有器官理想地工作,不是吗?此外,第二级缓存有助于休眠,因为休眠知道生成大量查询而不是复杂的联接。

  3. 我的问题是:一个复杂的数据库真的只被一个系统修改(例如网站)吗?如果我们谈论的是企业系统,数据库可以通过多个进程访问,共享不同的编程语言和平台。
    因此,在这种情况下,第二级缓存没有多大帮助。

  4. 休眠适合什么样的项目?它是否适用于没有人关心sql的后台项目?

  5. 当您的管理员说:请使用 memcached 进行缓存,并请使用此优化的查询而不是您的查询时,会发生什么情况?

如果您使用的是 oracle 数据库,orache 具有最先进的 sql 语法。他们在非常强大的语法上花费了大量的时间和金钱。如果不使用此语法,该怎么办?

该软件只编写一次(然后维护)并长时间使用。如果我是一家订购软件的公司,我会说:我会使用该软件几年,我喜欢快速,如果你花1个月的时间编写带有休眠的软件,我会再花一个月的时间购买使用示例IBATIS的软件,知道它会在几年内
更好地工作(当你买一辆车时,你对汽车经济感兴趣1kg-oil/km, 而不是制造商生产的汽车有多短和容易!因此,作为一名软件消费者,我对你的生产力不感兴趣,只是对软件的速度有多快感兴趣。当然,价格也是相关的,但是如果我们谈论价格,则有更复杂的数学。

当我们真的无法预测系统的某些部分时,我们可以称之为工程吗?
(如果电气工程师不能预测电流,他真的可以成为工程师吗)

请分享您的意见。

问候


答案 1

1) (...)这是真的吗?

不,它不是,Hibernate可以处理相当复杂的数据库,包括现有的数据库。但是,它可能无法很好地处理高度非规范化的数据库或外来架构。这是不同的。

2) (...)我的问题是,为什么一个庞大而昂贵的项目不关心sql优化?

这是毫无意义的,使用Hibernate并不意味着你不关心优化。我曾开发过一个庞大而复杂的STP系统(数亿欧元的预算),性能绝对是一个重要的问题,我们实际上引入了Hibernate,以从延迟加载,二级缓存(并加快开发)中受益。

以下是使用像Hibernate这样的ORM时的交易(如果合适):

  • 使用ORM将比不使用ORM更快地完成(否则使用它们没有任何意义)。
  • 绝大多数生成的查询都将正常运行(事实是Hibernate生成的SQL比普通开发人员更好)。
  • 您可以(并且必须)在一定程度上调整查询和休眠。
  • 即使您花一些时间进行性能优化(包括回退到本机SQL进行真正有问题的查询),您仍然可以更快地完成。

3) (...)因此,在这种情况下,第二级缓存没有多大帮助。

好吧,你是对的,使用二级缓存理想地意味着使用Hibernate API(尽管你仍然可以“手动”逐出缓存,尽管我更喜欢将其用于“主要读取”实体)。但是,更重要的是,根据我的经验,通过数据库在许多应用程序之间共享数据只会导致无法维护的应用程序(更改单个位变得不可能,因为它可能会影响多个应用程序),并且应该避免。使用 EAI/ESB 并通过它公开主系统的服务。这样,您可以重用业务逻辑、第二级缓存等。

4) (...)休眠适合什么样的项目?它是否适用于没有人关心sql的后台项目?

Hibernate对于CRUD应用程序来说确实非常好,但不仅如此(见上文),正如我已经说过的那样,您的问题显示出一些无知。但是,它不适用于任何项目:

  • 我可能不会将其用于数据仓库或大型报告应用程序。
  • 我可能不会将其与高度非规范化或异国情调的遗留数据库一起使用(在这种情况下,像mybatis这样的数据映射器可能是更好的选择)。
  • 我可能不会在现有系统中使用它,使用存储过程进行所有操作。
  • 我不会将其与非RDBMS数据存储一起使用:)

5) (...)当您的管理员说:请使用 memcached 进行缓存,并请使用此优化的查询而不是您的查询时,会发生什么情况?

我告诉他,memcached可能不是我们上下文中的最佳解决方案(不,我不想总是通过网络发送我的数据,我不在乎Facebook / LiveJournal / Twitter /任何东西都在使用它,我们的应用程序可能有不同的需求),在与Hibernate合作时还有其他更好的缓存实现,我要求他与我讨论问题,我们讨论各种解决方案, 等。我们作为一个团队工作,而不是相互对抗。

总而言之,ORM解决方案并不总是合适的,但我认为您目前有偏见的意见,我的经验与您的问题中表达的意见(误解?)不同。

另请参见


答案 2

它适用于绿地项目,但也适用于传统项目。您可能需要执行一些映射技巧,但它提供了相当灵活的映射。

由于您可以使用本机查询,并且由于您可以将其与您最喜欢的缓存解决方案集成,因此您不需要仅仅因为使用Hibernate而遭受任何性能问题。当您的数据库管理员说您应该使用 memcached 时,您可以使用此 memcached/Hibernate 集成。您可以使用自己喜欢的缓存编写缓存实现,并插入Hibernate。当她说你应该使用这个优化的查询时,你说“太好了!Hibernate有一个本机SQL工具,可以让我使用该查询”。您可以使用本机Oracle语法,也可以使用您选择的任何RDBMS的本机语法。

多应用程序环境对 Hibernate 的挑战与对任何解决方案的挑战相同。如果希望应用程序性能良好,则将使用相当于二级缓存的内容。休眠恰好提供了与缓存集成的ORM。它不能解决跨多个应用程序协调缓存的问题,但即使您不使用Hibernate,也必须解决此问题。


推荐