2017-04-25 82 views
2

我正在Spring,Java,Hibernate,Postgresql環境中工作。我在數據庫中看到一些非常嚴重的緩慢。我的具體問題是,如果我將Spring的@Transactional註釋添加到包含未觸及數據庫的方法的類中,它有多糟?換句話說,他們不需要交易。假設這些方法是一些更常用的方法。不必要的數據庫事務導致緩慢?

因此,像這樣(只是一個例子):

@Component 
@Transactional 
public class ProjectManager { 

    public String getProjectUrl(Project project) { 
     //simple logic that does not use the database 
     return "/my/url/" + project.getId(); 
    } 

} 

我知道有很多原因可能導致數據庫緩慢的因素。我只是想知道這是一個巨大的紅旗還是沒有那麼重要?我是否應該將這些方法拉出來,並將它們放入不帶@Transactional標記的不同類中?

TIA

+0

你有這個方法有沒有'@ Transactional'註解的基準嗎? –

+1

*「如果我添加Spring的'@ Transactional'註釋,它有多糟糕* *很少,除非您分析代碼說它存在問題,我懷疑它會。 – Andreas

+0

我不是100%確定它是否會有任何幫助,但[這裏](http://blog.jhades.org/how-does-spring-transactional-really-work/)你可以找到解釋當你使用'@ Transactional'時究竟發生了什麼 – saljuama

回答

4

首先,你getProjectUrl方法將春季方面被截獲,即:如果需要

  • 調用你的方法

    1. 創建交易
    2. 完成對交易

    這在spring docs。另外,Spring不夠聰明,不能理解方法代碼根本不使用數據庫(as we see see in source)。

    所以,我們絕對可以得出結論,春天的@Transactional造成一些開銷

    但是什麼樣的開銷?

    • 的Java在任何情況下 - 看點代碼實現反正
    • 取決於@Transactionalpropagation價值,我們可能被迫創建物理(DB)的交易。這會導致網絡+連接+數據庫端開銷。

    來自對岸,如果您刪除@Transactional,你應該也知道,Postgres的包裝隱性事務任何非事務性的SQL查詢(docs):

    的PostgreSQL實際上把每個SQL語句在交易中執行。如果不發出BEGIN命令,那麼每個單獨的語句都有一個隱含的BEGIN和(如果成功)COMMIT環繞它。

    最後,答案:如果您的方法不處理數據庫,請不要使用@Transactional