簡體   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