2011-07-02 13 views
2

Spring Frameworkは、プログラムによるトランザクション管理の2つの手段を提供します。TransactionTemplateとJdbcTemplate

1)TransactionTemplateを使用する。

2)PlatformTransactionManagerの実装を直接使用する。上記

は春サイトはこちらJDBCテンプレートを言及していない

http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html時で言及されています。私の理解によれば、jdbcテンプレートもトランザクションを内部的に管理しています。これもすべてプログラムで行われます。では、 TransactionTemplateとjdbc tempalteの基本的な違いは何ですか?

+3

あなたは春マニュアルの古代のバージョンの読み取りを停止する必要があります。 2.0.xは数年前です。 – skaffman

+0

私は調べるべき最新のバージョンは何ですか? –

+0

3.0.5は最新の安定です – abalogh

答えて

17

JdbcTemplateはトランザクションマネージャではありません。

これはJDBCコアパッケージの中心クラスです。 JDBCの使用を簡素化し、一般的なエラーを回避するのに役立ちます。コアJDBCワークフローを実行し、SQLを提供し結果を抽出するアプリケーションコードを残します。このクラスは、SQLクエリまたは更新を実行し、ResultSetsに対する反復処理を開始し、JDBC例外をキャッチし、org.springframework.daoパッケージで定義された汎用的で有益な例外階層に変換します。道による

TransactionTemplateは、プログラムによるトランザクション境界およびトランザクション例外処理を簡素化

テンプレートクラスです、また、トランザクションマネージャではありません。既存のトランザクションがあるかどうかを判断

  • それと

PlatformTransactionManager(及びAbstractPlatformTransactionManagerの他のサブクラス)は、トランザクション・マネージャあります。

  • は、適切な伝播動作を適用します。
  • は、必要に応じてトランザクションを中断し、再開します。
  • は、コミット時にロールバック専用フラグをチェックします。
  • は、ロールバック(実際のロールバックまたはロールバックのみの設定)に適切な変更を適用します。
  • は同期コールバックを登録します(トランザクション同期がアクティブな場合)。あなたの代わりに、宣言的トランザクションは、あなたがprogrammeticallyそれを実装したい扱う場合に使用されるTransactionTemplate、とは対照的に、

  • だから、このクラスは、実際のトランザクションを処理するための責任があります。 (かなり古いですが、 thisブログを参照してください、宣言的と手動の違いが表示されます)

    引用符Spring 3 Referenceから引用します。

    注:HibernateTemplate、JmsTemplateなど、他の* Templateクラスもあります。それらはすべて同じパターンに従います。書くべきコードの量を大幅に減らすテンプレートクラスです。呼び出されたボイラープレートコードはそれらによって処理されます。例(hereから):JdbcTemplateなし

    private DataSource dataSource; 
    
    public void setDataSource(DataSource dataSource) { 
        this.dataSource = dataSource; 
    } 
    
    public void insert(Customer customer){ 
    
        String sql = "INSERT INTO CUSTOMER " + 
          "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
        Connection conn = null; 
    
        try { 
         conn = dataSource.getConnection(); 
         PreparedStatement ps = conn.prepareStatement(sql); 
         ps.setInt(1, customer.getCustId()); 
         ps.setString(2, customer.getName()); 
         ps.setInt(3, customer.getAge()); 
         ps.executeUpdate(); 
         ps.close(); 
    
        } catch (SQLException e) { 
         throw new RuntimeException(e); 
    
        } finally { 
         if (conn != null) { 
          try { 
           conn.close(); 
          } catch (SQLException e) {} 
         } 
        } 
    } 
    

    そしてJdbcTemplateと:

    private DataSource dataSource; 
    private JdbcTemplate jdbcTemplate; 
    
    public void setDataSource(DataSource dataSource) { 
        this.dataSource = dataSource; 
    } 
    
    public void insert(Customer customer){ 
    
        String sql = "INSERT INTO CUSTOMER " + 
         "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
    
        jdbcTemplate = new JdbcTemplate(dataSource); 
    
        jdbcTemplate.update(sql, new Object[] { customer.getCustId(), 
         customer.getName(),customer.getAge() 
        }); 
    
    } 
    
    +0

    ありがとうございます。 transactionManagerとTransactionテンプレートをJdbcテンプレートで使用しないと、各メソッドでトランザクションがコミットされます。 右?しかし、トランザクションテンプレートとトランザクションテンプレートを PROPAGATION_REQUIREDのJdbcテンプレートで使用すると、主呼び出しメソッドを終了するときにtrnsactionがコミットされます。 は正しいですか? –