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

标签 java spring mongodb hibernate nosql

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

当我认真思考时,我最不喜欢 java 的有 3 个主要方面:

  1. 服务器在修改 Controller 或其他类时启动/停止。动态语言在这方面是对 Java 的巨大胜利。
  2. Hibernate、延迟加载异常(尤其是那些发生在异步服务调用或 Jackson JSON 编码期间的异常)和一般的 ORM 膨胀。 Hibernate 本身就是导致集成启动时间缓慢和应用程序启动时间异常缓慢的原因。
  3. Java 愚蠢 - 与 Tomcat 相比,在 IDE 中运行应用程序时会出现不一致的类加载问题。当然,一旦您解决了这些问题,您很可能不会再看到它们。尽管如此,其中大部分实际上是由 Hibernate 引起的,因为它坚持使用特定的 Antlr 版本等等。

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

你们中有没有人重新设计了 50 多个实体的 Java 应用程序以使用 mongo 或 couch 或类似的数据库?是怎样的体验?你推荐吗?假设您有一些非常棒的单元/集成测试,您花了多长时间?这个想法听起来比实际更好吗?

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

当涉及到 NoSQL 数据库时,我真的很新手,所以任何关于迁移(或不迁移)大型 java/spring 项目的建议都会非常有帮助。另外,如果这是个好主意,您会推荐我阅读哪些书籍以加快速度并真正以最佳方式将它们用于此应用程序?

谢谢

最佳答案

无论如何,您的咆哮不仅涉及先前为 Hibernate 做出的(遗留)决定的问题,还涉及您作为程序员的总体发展。

如果一个类似的项目落在我的腿上并且急需重构或改进,我就会这样做。

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

短期内保留用 Java 编写的应用程序似乎是明智的,用另一种语言进行重大重写肯定会破坏验收和集成测试。

按照 Joseph 的建议,从 Hibernate 过渡到 JPA。它不应该花费太多时间。从那里您可以将后端切换到其他存储方式。努力寻找一种分离关注点的方法。选择任何看起来最好的概念,一些人喜欢 MVC,而另一些人可能选择 CQRS,还有一些人喜欢另一种分割/分离风格。

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

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

旁注:如果 IDE 能够将其自己的库注入(inject)到我的构建或运行时路径中,我从不相信我的 IDE 能够正确获取依赖项。

所以简而言之:小步骤;丢掉 Hibernate 并更抽象地转向 JPA;如果 Java 变得愚蠢,那么逐渐转向一种聪明的语言。您主要关心的应该是在不丢失功能的情况下重构代码库,并牢记开放式设计,这将使以后更容易添加有趣和酷的功能。

关于java - 为 MongoDB 淘汰 Hibernate/Mysql 或为 Java/Spring/Tomcat Web 应用程序淘汰 Couch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777998/

相关文章:

node.js - Mongo/Mongoose 检查项目是否存在

javascript - 向 mongodb 领域发送数据会出现 400 错误

java - Struts2 记住我

java - Spring Security 自定义 FORM_LOGIN_FILTER 不起作用

java - 在 spring boot 应用程序中外部化查询

java - 尝试将我的 main/java 类文件编译为 .jar,然后也生成 .war

node.js - 你如何一次保存到三个集合?

java - MongoDB聚合查询转java代码

java - 从命令行运行 Java 3D 程序

Java 正则表达式能够单独处理嵌套匹配