我开始学习工具包spring jdbc
。在春天阅读一些关于transactions 的文档,结束它们的模板。尽管如此,一些常见的事情我不清楚。spring jdbc + PlatformTransactionManager + spring数据+理论
1)如果我们有Spring Data
为什么总是听到只有约Spring JDBC
Spring框架有一些项目像Spring MVC
,Spring Security
等
首先,我试图找到Spring JDBC
春的主站点,但不发现它。而不是我发现Spring Data
项目。经过一番研究,我发现Spring Data
使用Spring JDBC
JDBC Extensions
子项目和最后有一些oracle
具体操作有什么有趣的我。我意识到什么没有看到或听到任何使用或看到教程Spring Data
参考。这真的很糟糕?
2)我应该创建的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
方法末尾,我们有行this.transactionManager.commit(status)
。因此,我如何理解它,所有我在doInTransaction
方法中的内容都将在单个事务中执行。但是如何在其他方法中使用相同的事务执行其他DAO
?它限制了用复杂的逻辑写客户端。我的意思是所有的逻辑必须用一种方法?我认为这不可能是真的。
我的意思是说复杂的逻辑。例如,我有我自己的模板方法。
/*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()
方法。
但仍不清楚它是线程安全的?即我可以使用它,并确保所有来自jdbcTemplate
的JDBC
s callableStatment.execute()
方法的内部呼叫都将指向此并且仅限于此交易。并没有看到其他线程中的另一个事务。
感谢您的阅读。
感谢您对一个问题的回答 – Mrusful 2013-03-07 11:52:13