2016-06-22 26 views
0

我在我的項目中遇到了舊代碼,其中使用同一個連接對象從父表和子表中刪除數據。使用相同的連接對象來刪除父表和子表

public void delete() 
{ 
    Connectio con = // Create a connection 
    deleteChildData(con); // Delete data from child table/ associated table first 
    super.delete(con) // Delete data from parent table 

} 

顯而易見的是除非我在這deleteChildData()函數沒有關閉連接它的罰款。但我不確定這種方法會有什麼其他問題,如果我使用2個不同的連接對象,是否會更好地解決這個問題。

回答

0

通過JDBC事務,您可以控制事務應該如何以及何時提交到數據庫中。

爲了把這個事務中,你可以使用

  1. dbConnection.setAutoCommit(false);開始一個事務塊。
  2. dbConnection.commit();結束一個事務塊。

你的方法將在下面的順序執行:

PreparedStatement preparedStatementDelete = null; 

     con.setAutoCommit(false); 

     preparedStatementDelete = con.prepareStatement("DELETE_QUERY"); 

     preparedStatementDelete.executeUpdate(); 

     con.commit(); 
0

創建新的連接是昂貴時,已經可以創建連接和。所以最好嘗試重新使用連接。

0

獲取數據庫連接(這是一個資源,其他示例可以是文件句柄等)是昂貴的。所以如果你可以無痛地選擇使用1或2個連接,前者的性能會更好。但是,我們有一個名爲的連接池,它在某處存儲了許多連接(不是在事務或函數之後立即釋放每個連接),因此您不必在一些SQL之後關閉連接查詢,並在需要時連接池管理器以進行連接(並讓管理器從池中獲取連接或在池中沒有任何剩餘池時創建新連接)。連接池可以提高性能,但啓動服務器時只佔用一點存儲空間和一些額外的CPU週期(獲得最初的連接數量),因此大多數人都使用它。

然後,如果您使用連接池,則在方法中使用1或2個連接(除非第二個連接恰好使池管理器創建新連接)之間沒有太大差別。

大多數基於JVM的服務器都提供連接池功能,您可以參考相應的文檔以瞭解使用情況。但是可以肯定的是,如果你的項目之前沒有使用過,那麼這將會非常重構,所以你的問題的答案可能是「1」。

相關問題