ツールキットの学習を開始しspring jdbc
ました。
春のトランザクションに関するいくつかのドキュメントを読んで、テンプレートを終了してください。それにもかかわらず、いくつかの一般的なことが私にはわかりません。
1)常に Spring フレームワークについてしか聞いていないのに、など
のようなプロジェクトがあるのはSpring Data
Spring JDBC
なぜですか。まず、Spring のホーム サイトで見つけようとしましたが、見つかりませんでした。代わりに、プロジェクトを見つけました。いくつかの調査の後、私はサブプロジェクトで使用されたものを見つけ、最後に私にとって興味深い特定の操作を行いました。そして、私は、チュートリアルで. それは本当に何か悪いですか?
Spring MVC
Spring Security
Spring JDBC
Spring Data
Spring Data
Spring JDBC
JDBC Extensions
oracle
Spring 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)
ます。メソッドの最後にexecute
line があり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)
。これは私PlatformTransactionManager
とTransactionDefinition
. どのように私は理解して、このテキスト行を書き始めた瞬間に、このクラスは、質問 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 からのJDBC
scallableStatment.execute()
メソッドのすべての内部呼び出しがjdbcTemplate
これを参照し、このトランザクションのみを参照することを確認できますか。また、他のスレッドで別のトランザクションが表示されません。
読んでくれてありがとう。