簡體   English   中英

Spring jpa:我是否需要在檢索查詢上添加@Transactional 注釋

[英]Spring jpa: Do I need to add @Transactional annotation on retrieval queries

我在 Spring Boot 應用程序中使用EntityManger進行檢索查詢。 下面給出了一個示例片段。

@Repository
public class EntityManagerUtil {

  @PersistenceContext
  private EntityManager entityManager;


  public List<Employee> getAll(){

    // Use entityManager here
    
  }
}

我需要澄清以下問題。

一種。 EntityManger是否會為每次調用創建(或)它是一個單例? (我嘗試打印 entityManager,它為所有調用返回相同的對象)

這種方法是否會導致任何連接泄漏?

C。 我是否需要在讀取操作上添加@Transactional注釋?

我正在使用 Spring Boot 版本 2.0.3-release

a) 請參閱 M Deinum 關於注入的 EntityManager 作為代理的評論。 JPA 的正常情況是將 EntityManager 綁定到每個線程,Spring 為您設置它並提供代理以委托給實際的 EntityManager。 所以這種安排是安全的。

b) 當您不將數據庫連接返回到池時會發生連接泄漏。 Spring 負責提供連接和清理資源,因此在正常情況下您不應該出現連接泄漏。 如果你忽略 Spring 給你的便利,比如 JdbcTemplate,堅持編寫你自己的 JDBC 代碼,那么你可能會導致資源泄漏。 如果您的代碼嘗試使用用於另一個線程的 EntityManager,您將收到異常,它不會靜默失敗,並且不會(本身)導致連接泄漏。

c) 您正在使用 RDBMS,因此您將有一個事務。 顯然有些人認為交易是可選的,但實際上並非如此。 如果您不指定它們,那么 Spring 會將每個操作包裝在自己的事務中。 一般來說,您不僅最好明確說明這一點,而且您可以將事務標記為只讀,這讓 Spring 執行一些優化,有關詳細信息,請參閱Oliver Drotbohm 的回答 因此,在某些情況下(例如,每個 http 請求僅導致一次數據庫操作),也許您可​​以不使用它,但使用它符合您的利益。

暫無
暫無

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

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