我开始学习工具包spring jdbc
。阅读有关transactions的一些文档
在春天结束他们的模板。尽管如此,我还不清楚一些常见的事情。
1)如果我们Spring Data
为什么总是只听到Spring JDBC
的话
Spring框架有一些项目,如Spring MVC
,Spring Security
等。
首先,我尝试在Spring的主页上找到Spring JDBC
,但没有找到它。而不是我发现Spring Data
项目。经过一些研究后,我发现Spring Data
在Spring JDBC
子项目中JDBC Extensions
使用了oracle
,并且最后有一些Spring Data
具体操作对我来说很有意思。我意识到没有看到或听到任何用途的内容,或者在JdbcTemplate
的教程中看到参考文献。真的不好吗?
2)我应该每次都创建新的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...
}
,有用的模板方法。所有文档都充满了像
setDataSource
他们也写在文档中
一旦配置了JdbcTemplate类的实例就是线程安全
这是误导。为什么在dataSource
方法中,如果他们可以将TransactionTemplate
放入已创建的实例中,或者我误解了它,则会创建新实例?
3)我们如何使用TransactionTemplate
编写复杂的客户端逻辑?
TransactionStatus
另一个适用于execute
的模板。据我所知,它可以帮助我管理我的交易,但有多少帮助?
在[{1}} 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()
方法。
但仍然不清楚它是线程安全的吗?即我可以使用它,并确保来自JDBC
的{{1}} callableStatment.execute()
方法的所有内部调用都将引用此事,并且仅针对此事务。而不是在其他线程中看到另一个事务。
感谢阅读。
答案 0 :(得分:1)
关于JdbcTemplate:
jdbc模板由spring提供与数据库交互。您可以使用简单的JDBC代码连接数据库并执行操作,但在这种情况下,您必须处理与连接关闭等相关的问题.Spring jdbc模板处理所有这些问题,最终用户只需要使用这些api和执行操作。
关于新的JDBCTemplate(),我认为这只是一个例子,即你不需要在每个类中创建jdbc模板对象。您可以像数据源一样创建它的bean,也可以为此创建BaseDAO类。
答案 1 :(得分:0)
还有一件事,请浏览Spring Data Support个视频。这些是学习JDBC模板基础的非常好的视频。
答案 2 :(得分:0)
你需要意识到Spring已经存在了11年了。它是进化而来的。已经有许多项目开始作为Spring的辅助项目,已经融入其中。自从Rod Johnson第一次编写它以来,Spring JDBC一直存在。 Spring Data是最近的发展。