簡體   English   中英

使用CDI對性能的影響

[英]Performance impact of using CDI

我正在編寫一個Java EE 6 Web應用程序,我注意到在使用注入對象與直接創建和使用對象時會對性能產生重大影響。 每個方法調用的開銷似乎是50-60ms。

例如,使用非注入150方法調用大約需要500毫秒,而使用注入對象150方法調用需要12,000 - 13,000毫秒。 一個數量級的差異然后一些。

這通常嗎?

我在JBoss AS 7.1.1 final上運行,它使用Weld來處理CDI。

注入的對象被定義為單例bean(通過javax.ejb.Singleton注釋)。 這會導致部分問題嗎? 或者只是Weld代理導致減速?

在優秀的Weld論壇的幫助下,我發現:

默認情況下,單例會話bean是事務性的(EJB 3.1規范的第13.3.7節),並且需要為每個業務方法調用獲取獨占鎖(第4.8.5.4節和第4.8.5.5節)。 相反,javax.inject.Singleton不是事務性的,並且不支持容器管理的並發(主要結果是容器沒有實現鎖定方案)。

如果使用@TransactionAttribute(NOT_SUPPORTED)和@Lock(READ)注釋單個會話bean,您應該會看到明顯更好的性能,盡管可能仍有一些開銷。 如果您不需要EJB功能,請堅持使用@ApplicationScoped(javax.inject.Singleton不是由CDI定義的,因此其語義不受該規范的約束)。

https://community.jboss.org/thread/213684?tstart=0

遺憾的是,即使用@TransactionAttribute(NOT_SUPPORTED)和@Lock(READ)注釋我的EJB單例之后,性能仍然非常差(參見原帖的時間)。

所以帶回家的消息是不要注入EJB Singleton會話bean,除非你絕對必須,甚至那時要注意可能產生的性能開銷。 對於很少被調用的方法,它可以忽略不計,但在我們的例子中,如果它是一種使用頻繁的方法,則小的開銷會迅速累積。

我們不需要EJB功能,並且在切換到ApplicationScoped時,看到了調用注入bean的特定方法的性能的數量級改進。

暫無
暫無

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

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