【发布时间】:2013-03-07 10:13:11
【问题描述】:
我确实开始学习工具包spring jdbc。阅读一些关于 transactions 的文档
在春天结束他们的模板。尽管如此,我还不清楚一些常见的事情。
1) 如果我们有Spring Data,为什么总是只听说Spring JDBC
Spring 框架有一些项目,如Spring MVC、Spring Security 等。
首先,我尝试在 Spring 的主页上找到 Spring JDBC,但没有找到。而不是我找到了Spring Data 项目。经过一番研究,我发现Spring Data 在JDBC Extensions 子项目中使用了Spring JDBC,最后有一些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 一起使用。据我了解,它可以帮助我管理我的交易但有多大帮助?
在TransactionTemplate 的execute 方法的开头,我们有transactionManager.getTransaction(this)。在execute 方法的末尾,我们有this.transactionManager.commit(status) 行。因此,我如何理解它,我在doInTransaction 方法中放置的所有内容都将在单个事务中执行。但是如何在其他方法中使用相同的事务执行其他 DAOs 呢?它限制了编写具有复杂逻辑的客户端。我的意思是所有逻辑都必须采用一种方法?我认为这不可能是真的。
我所说的复杂逻辑是什么意思。例如我有自己的模板方法。
/*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 的JDBCs callableStatment.execute() 方法的所有内部调用都将引用此事务并且仅引用此事务。并且在其他线程中看不到另一个事务。
感谢阅读。
【问题讨论】:
标签: java spring jakarta-ee spring-jdbc