我确实开始学习工具包spring jdbc
。
在 spring end 他们的模板中阅读一些关于事务的文档。尽管如此,我还不清楚一些常见的事情。
1)如果我们Spring Data
总是听说Spring JDBC
Spring 框架有一些项目,比如Spring MVC
,Spring Security
等等。
首先我尝试Spring JDBC
在 Spring 的主页上找到,但没有找到。而不是我找到了Spring Data
项目。经过一些研究,我发现了子项目中Spring Data
使用的内容,最后有一些具体的操作对我来说很有趣。我意识到什么没有看到或听到任何使用或看到教程中的参考。真的有什么不好的吗?
Spring JDBC
JDBC Extensions
oracle
Spring Data
2)我应该每次创建 JdbcTemplate 的新实例
Next 是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
方法的开始。在方法的末尾,我们有 line 。因此,我如何理解它,我在方法中放置的所有内容都将在单个事务中执行。但是如何在其他方法中执行具有相同事务的其他 s 呢?它限制了编写具有复杂逻辑的客户端。我的意思是所有逻辑都必须采用一种方法?我想这不可能是真的。
我所说的复杂逻辑是什么意思。例如,我有自己的模板方法。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()
的方法。
但仍然不清楚它是线程安全的吗?即我可以使用它并确保所有来自 will 的JDBC
scallableStatment.execute()
方法的内部调用jdbcTemplate
都引用这个并且只引用这个事务。并且在其他线程中看不到另一个事务。
谢谢阅读。