spring jdbc + PlatformTransactionManager + spring数据+理论

时间:2013-03-07 10:13:12

标签: java spring java-ee spring-jdbc

我开始学习工具包spring jdbc。阅读有关transactions的一些文档 在春天结束他们的模板。尽管如此,我还不清楚一些常见的事情。

1)如果我们Spring Data为什么总是只听到Spring JDBC 的话 Spring框架有一些项目,如Spring MVCSpring Security等。
首先,我尝试在Spring的主页上找到Spring JDBC,但没有找到它。而不是我发现Spring Data项目。经过一些研究后,我发现Spring DataSpring 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)背后的原因。这代表我PlatformTransactionManagerTransactionDefinition。我怎么理解,在我开始写这行文字的时候,这个类可以帮助我实现我在问题#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()方法的所有内部调用都将引用此事,并且仅针对此事务。而不是在其他线程中看到另一个事务。

感谢阅读。

3 个答案:

答案 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是最近的发展。