-1

ツールキットの学習を開始しspring jdbcました。 春のトランザクションに関するいくつかのドキュメントを読んで、テンプレートを終了してください。それにもかかわらず、いくつかの一般的なことが私にはわかりません。

1)常に Spring フレームワークについてしか聞いていないのに、など のようなプロジェクトがあるのSpring DataSpring JDBCなぜですか。まず、Spring のホーム サイトで見つけようとしましたが、見つかりませんでした。代わりに、プロジェクトを見つけました。いくつかの調査の後、私はサブプロジェクトで使用されたものを見つけ、最後に私にとって興味深い特定の操作を行いました。そして、私は、チュートリアルで. それは本当に何か悪いですか?
Spring MVCSpring Security
Spring JDBCSpring DataSpring DataSpring JDBCJDBC ExtensionsoracleSpring Data

2) Next が便利なテンプレート メソッドであるたびに、JdbcTemplate の新しいインスタンスを作成する必要があります。すべてのドキュメントには、次のようなコードの例がたくさんあります
JdbcTemplate

public class JdbcCorporateEventDao implements CorporateEventDao {

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    // JDBC-backed implementations of the methods on the CorporateEventDao follow...
}

そして、彼らはドキュメントにも書いています

 JdbcTemplate クラスのインスタンスは、一度構成するとスレッドセーフになります

これは誤解を招きます。すでに作成されたインスタンスを挿入できる場合、または誤解した setDataSource場合、メソッドで新しいインスタンスを作成するのはなぜですか?dataSource

3)洗練されたクライアント ロジックを記述するためにどのように使用できますか? TransactionTemplate
TransactionTemplateで動作する別のテンプレートTransactionStatus。私が理解しているように、それは私のトランザクションを管理するのに役立ちますが、どの程度役立ちますか? executeメソッドの開始時にTransactionTemplateがありtransactionManager.getTransaction(this)ます。メソッドの最後にexecuteline がありthis.transactionManager.commit(status)ます。したがって、私がそれをどのように理解しているか、doInTransactionメソッドに配置したものはすべて単一のトランザクションで実行されます。しかしDAO、別のメソッドで同じトランザクションで他の s を実行するのはどうですか? 洗練されたロジックでクライアントを作成することを制限します。すべてのロジックを 1 つのメソッドに含める必要があるということですか? ありえないと思いました。
洗練されたロジックとはどういう意味ですか。たとえば、独自のテンプレート メソッドがあります。

/*abstract class definition*/

public final void execute(){
    onPreExec();
    exec();
    onPostExec();
}

abstract void exec(); //client execute few DAOs methods

public void onPreExec(){}

public void onPostExec(){} //commit or rollback transaction in another method

/*other class members*/



4) 「PTM」、「TD」、「TS」を使用してもスレッドセーフですか?
さらに、背後にあるものを調査し始めますthis.transactionManager.commit(status)。これは私PlatformTransactionManagerTransactionDefinition. どのように私は理解して、このテキスト行を書き始めた瞬間に、このクラスは、質問 3 の目標を達成するのに役立ちます。たとえば、私はこのようにすることができます:

/*abstract class definition*/

protected PlatformTransactionManager ptm;
protected TransactionDefinition td;
protected TransactionStatus ts;//TS with PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED

public final void execute(){
    onPreExec();
    exec();
    onPostExec();
}

abstract void exec(); //client execute few DAOs methods

public void onPreExec(){//start transaction
    ts=ptm.getTransaction(td);
}

public void onPostExec(){//end transaction
    if (exec.wasCompletedSuccessfully()){
       dao.markJobCompleted(); //do some for fix execution completeness
       ptm.commit(ts);
    } else {ptm.rollback(ts);}

}

/*other class members*/

transactionTemplate.execute()少なくとも、これは場合によってはメソッドよりも便利に見えます。いくつかの部分に分割しただけですがtransactionTemplate.execute()

しかし、それがスレッドセーフであることはまだ明確ではありませんか? つまり、それを使用して、will からのJDBCscallableStatment.execute()メソッドのすべての内部呼び出しがjdbcTemplateこれを参照し、このトランザクションのみを参照することを確認できますか。また、他のスレッドで別のトランザクションが表示されません。

読んでくれてありがとう。

4

3 に答える 3

1

JdbcTemplate について:

jdbc テンプレートは、データベースと対話するために spring によって提供されます。シンプルな JDBC コードを使用してデータベースに接続し、操作を実行できますが、この場合、接続の終了などに関連する問題を処理する必要があります。Spring jdbc テンプレートはこれらすべての問題を処理し、エンド ユーザーはこれらの API を使用して操作を実行するだけで済みます。

new JDBCTemplate() に関しては、これは単なる例だと思います。つまり、各クラスで jdbc テンプレート オブジェクトを作成する必要はありません。データ ソースのような Bean を作成するか、このための BaseDAO クラスを作成できます。

于 2013-03-07T10:25:24.333 に答える
0

Spring が登場してから 11 年が経過したことを認識する必要があります。進化しました。Spring の補助として開始され、Spring に組み込まれているプロジェクトがたくさんあります。Spring JDBC は、Rod Johnson が最初に書いたときから存在しています。Spring Data は最近開発されたものです。

于 2013-03-07T10:52:03.380 に答える
0

もう 1 つだけ、 Spring Data Supportビデオをご覧ください。これらは、JDBC テンプレートの基本を学ぶのに非常に良いビデオです。

于 2013-03-07T10:29:11.867 に答える