繁体   English   中英

为Java / Spring / Tomcat Web应用程序淘汰MongoDB或Couch的Hibernate / Mysql

[英]Ripping out Hibernate/Mysql for MongoDB or Couch for a Java/Spring/Tomcat web application

我有一个正在进行大规模返工的应用程序,我一直在探索不同的选项 - “按原样”进行调整,在不同的框架或平台中重做项目等。

当我真的想到它时,这里有三个我不喜欢java的主要内容:

  1. 修改控制器或其他类时服务器启动/停止。 动态语言在这里是对Java的巨大胜利。
  2. Hibernate,Lazyloading异常(特别是在异步服务调用或Jackson JSON编组期间发生的异常)和ORM膨胀。 Hibernate本身就是缓慢的集成启动时间和极其缓慢的应用程序启动时间的原因。
  3. Java愚蠢 - 与Tomcat相比,在IDE中运行应用程序时出现的类加载问题不一致。 一旦你解决了这些问题,你很可能再也看不到它们了。 即便如此,其中大部分都是由Hibernate引起的,因为它坚持使用特定的Antlr版本等等。

在思考问题之后......如果我摆脱Hibernate,我可以解决或至少改善所有这三个方面的情况。

你有没有重新设计50多个实体java应用程序来使用mongo或沙发或类似的数据库? 经历是什么样的? 你推荐它吗? 假设你有一些非常棒的单元/集成测试需要多长时间? 这个想法听起来比实际更好吗?

如果我可以存储文档,我的应用程序实际上会在许多方面受益。 它实际上会为这个应用程序打开一些非常酷和有趣的功能。 但是,我确实希望能够为复杂的搜索创建动态查询......而且我被告知Couch不能这样做。

对于NoSQL数据库,我真的很环保,所以任何有关迁移(或不迁移)大型java / spring项目的建议都会非常有用。 另外,如果这是一个好主意,你会推荐哪些书籍让我加快速度,并以最好的方式真正利用它们来应用这个应用程序?

谢谢

无论如何,你的咆哮不仅仅包括先前为Hibernate做出的(传统)决定的问题,还包括你作为程序员的开发。

如果类似的项目放在我的膝盖上并且急需重构或改进,我就会这样做。

这取决于软件生命周期的阶段以及如果您要进行重大更改或坚持使用较小的更改所涉及的时间压力。 然而,从长远来看,以增量进行迁移似乎是您的最佳选择。

保持短期内用Java编写的应用程序似乎是明智之举,另一种语言的重大改写肯定会破坏接受和集成测试。

像约瑟夫建议的那样,从Hibernate迈向JPA。 它不应该花费太多时间。 从那里你可以将后端切换到其他一些存储方式。 努力解决问题。 选择看起来最好的概念,有些人更喜欢MVC而其他人可能会选择CQRS,还有一些人喜欢另一种分割/分离方式。

由于JVM支持多种语言,因此您始终可以切换到其中任何一种语言,或者至少部分地以更动态的语言实现功能。 这将解决部分问题,即您不断碰到Java的“愚蠢”,同时仍然保留当前JVM在运行时的出色优化。

此外,您可能希望设置自动集成测试...因为希望永远不会从IDE运行应用程序,所以这些测试将为您提供真实的结果。

旁注:如果IDE具有将自己的库注入构建或运行时路径的功能,我从不相信我的IDE能够正确获取依赖关系。

简而言之:小步骤; 失去Hibernate并对JPA更加抽象; 如果Java变得愚蠢,那么逐渐转向一种聪明的语言。 您主要关注的是重构代码库而不会丢失功能,请记住,开放式设计将使以后更容易添加有趣和酷炫的功能。

嗯,很大程度上取决于“Hibernate的痛点究竟是什么?” (我知道,你举了三个例子......)

但从长远来看,这些不是核心问题。 你遇到的是编译语言与动态语言的本质; 在运行时,它对您来说效果更好(因为Java比动态语言更快,更具可扩展性,基于我不太详尽的测试),但在开发时,它不太可能只是破解垃圾并希望它的工作原理。

虽然文档存储可以,NoSQL不会解决问题,但是你需要经历一个迁移步骤。

重要提示:我为这个领域的供应商工作,这解释了我在该领域的经验,以及下一段中的偏见​​:

我想,你专注于开源项目,虽然我建议使用商业产品:GigaSpaces(http://gigaspaces.com)。 有一个社区版本,允许您将基于JPA的java对象迁移到文档模型(通过SpaceDynamicProperties批注); 您可以将JPA用于您编写的代码,并在您方便时慢慢迁移到完全面向文档的模型,此外复杂的查询也不是问题。

所有这些点通常都会因为无能而导致问题,而不是休眠或java存在问题:

  • 除了结构修改(添加字段或方法)之外,java代码中的所有更改都在调试模式下进行热交换,因此您可以保存和测试(无需任何重新部署)。

  • LazyInitializationException仅适用于hibernate-beginners。 有很多明确的解决方案,您可以通过简单的谷歌搜索或搜索结果搜索找到它们。 您始终可以将集合设置为fetch=FetchType.EAGER 或者您可以使用Hibernate.initialize(..)来初始化延迟集合。

  • 库需要另一个库的特定版本是完全正常的(相反的是可疑和错误的)。 如果你保持你的类路径干净(例如通过使用maven或常春藤),你将不会有任何类加载问题。 我从来没有过。

现在,我将提供一个替代方案。 spring-data是一个由springsource组成的新项目组合项目,它允许您将实体用于一堆NoSQL存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM