簡體   English   中英

春季-去耦與性能

[英]Spring - Decoupling Vs Performance

我有一個具有以下java文件的應用程序:

服務:

AccountService.java
UserService.java
MessageService.java

DAO:

AccountDAO.java
UserDAO.java
MessageDAO.java

表格:

ACCOUNTS
USERS
MESSAGES

MessageService.java ,我具有一個newMessage()函數,該函數必須從所有3個表中查詢數據。

(1)根據Spring的去耦標准,這是應該如何進行調用的方法:

                     AccountDAO.java -- ACCOUNTS
                    /
MessageService.java -- MessageDAO.java -- MESSAGES
                    \
                     UserDAO.java -- USERS

但是問題是,這種方法進行了3次DB調用。

(2)為了獲得更好的性能,我會這樣做:

MessageService.java -- MessageDAO.java -- Join ACCOUNTS, MESSAGES and USERS

但是這樣,它緊密地聯系在一起,如果USERS表發生變化,我也必須更改MessageDAO.java(以及我擁有的所有其他DAO,都使用USERS表)。 真的很糟糕,因為(非假設的)我們有很多DAO

哪種方法被認為是更好的做法? 還是我錯過了另一種方法?

根據Spring的去耦標准,這就是調用的方式

這是錯誤的。 Spring沒有“解耦標准”。 請在Spring文檔中找到我的參考,該參考告訴您如何構造持久層代碼。

通常,對於應用程序要操作的每個“實體”,您將都有一個DAO,但是將這種模式應用到將一個將多個表連接成三個不同查詢的查詢解構的極端情況是愚蠢的。

如果您需要一個newMessage()方法來將查詢中的某些表連接在一起,請選擇最有意義的MessageDAO可能是MessageDAO然后以有意義的方式編寫查詢/方法。

但是沒有規則說每個實體都必須有不同的查詢,並且不允許一個DAO類進行涉及其他實體表的查詢。 這太極端了,沒有好處。

另一方面,如果您擔心擁有多個可以了解所有表的數據層類的可維護性,那么可以考慮使用parsifal提到的ORM解決方案來減輕這項工作。

另一種方法是使用ORM(例如Hibernate)將每個表映射到一個實體。 然后定義這些實體之間的邏輯關系。 例如,用戶和消息之間的1:M關系。 隨着表的更改,您的映射將需要更改,但是您的SQL不需要更改(因為Hibernate會生成它)。

對於大多數關系,Hibernate非常擅長創建聯接以在一個查詢中檢索相關實體。 您可以控制是否發生這種情況。 對於大多數關系,我建議將延遲加載作為默認設置,並根據需要切換到緊急加載。

如果數據可能在一個查詢和下一個查詢之間改變,則作為3個單獨的查詢執行此操作可能會影響正確性。 不要讓(您的想法)Spring的准則使您編寫得到錯誤結果的代碼。

聽起來像加入SQL是正確的方法。

無論采用哪種方法,始終都是要在去耦和性能之間找到一個最佳位置。 它甚至可以選擇層數等。

所以我想按照@mattb的建議,如果在特定上下文中有意義,那么在DAO中聯接表是完全可以的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM