2011-07-02 53 views
1

在JDBC中,我們可以說,只要我們獲得連接,交易就會開始,並在關閉連接時完成 。這是正確的嗎?如果可以,我們可以說在不同的請求共享 相同的連接,即使所有未提交的交易將全部可見 所有請求?JDBC事務開始

回答

2

@BalusC - 這是不正確的。默認情況下,autocommit設置爲true,這意味着事務在任何JDBC操作之前開始,並在該單一操作後結束RIGHT,而不是在連接關閉時結束。

但你說得對,共享連接確實不好,如果你想多線程你的數據庫,最好是以你有線程池的方式處理它(在java.util.concurrent中查找ThreadPoolExecutor)和對於每個線程,您都會獲得單獨的連接。 ConnectionPool也是一個不錯的選擇,但我寧願通過ThreadPool來限制它 - 這種方式永遠不會有一個線程等待來自池的連接。

1

沒錯。這是默認行爲。在完成所有查詢後,檢索連接並提交connection.commit()後,您可以通過將自動提交設置爲falseconnection.setAutoCommit(false)來接管此控件。

但是,在不同的請求(線程)之間共享連接本身就是一個糟糕的設計。你的應用程序是這種方式不是線程安全的。您不想在不同線程之間共享相同的連接。如果你只想要消除連接數據庫的成本,那麼你應該考慮使用連接池。

0

訪問數據庫時的第一條規則。 每一個非事務性操作中應:

1.open連接,如果有連接池,然後從池中獲取 2.連接創建執行語句 3.如果在讀取查詢然後映射結果集。 4.關閉結果集。 5.關閉聲明。 6.關閉連接。

,如果你想你的操作是在交易,那麼你應該考慮這種方法:

操作1:1。 getSharedConnection 2.創建/執行語句 3.如果在讀取查詢然後映射結果集。 4.關閉ResultSet 5. close語句

操作2: 同操作1.

和該事務:

公共無效updateInTransaction(){ 連接康恩= pool.getConnection() ; //或者你可以創建一個新的連接 conn.setAutocommit(false); operation1(conn); operation2(conn); conn.close; }

這只是小應用程序的基礎知識。 如果你正在開發更大的應用程序,你應該使用來自Springsoruce的相同框架,如JDBCTemplates。