spring jdbc + PlatformTransactionManager + spring data + the



我确实开始学习工具包spring jdbc。阅读一些关于事务的文档春天结束了他们的模板。然而,有些普通的事情我不太清楚。

1) 如果我们有Spring Data,为什么总是只听到Spring JDBC
Spring框架有一些项目,如Spring MVC, Spring Security等。
首先我试图在Spring的主页上找到Spring JDBC,但没有找到它。而不是我发现Spring Data项目。经过一番研究,我发现Spring DataJDBC 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...
}

他们也写在docs

JdbcTemplate类的实例在配置后是线程安全的

这是误导。为什么在setDataSource方法中,如果他们可以把dataSource放在已经创建的实例中,他们会创建新的实例?

3) 我们如何使用TransactionTemplate来编写复杂的客户端逻辑?
TransactionTemplateTransactionStatus一起工作的另一个模板。据我所知,它可以帮助我管理我的事务但是有多大帮助?在TransactionTemplateexecute方法的开头,我们有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) 是线程安全的使用"天车"、"TD"、"t"?
我开始进一步调查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()方法。

但仍然不清楚它是线程安全的吗?也就是说,我可以使用它,并确保jdbcTemplateJDBCcallableStatment.execute()方法的所有内部调用都将引用此事务,并且仅引用此事务。并且不会在其他线程中看到另一个事务。

关于JdbcTemplate:

jdbc模板是spring提供的与数据库交互的模板。您可以使用简单的JDBC代码来连接数据库并执行操作,但在这种情况下,您必须处理与连接关闭等相关的问题。Spring jdbc模板处理所有这些问题,最终用户只需要使用这些api并执行操作。

关于新的JDBCTemplate(),我认为这只是一个例子,即你不需要在每个类中创建jdbc模板对象。您可以创建它的bean,如数据源或为此创建BaseDAO类。

还有一件事,请浏览Spring Data Support视频。

这些是学习JDBC模板基础的很好的视频。

您需要认识到Spring已经存在11年了。这是进化而来的。有很多项目一开始是作为Spring的附属项目,后来被纳入了Spring。自从Rod Johnson第一次写Spring JDBC以来,它就一直存在。Spring Data是最近才发展起来的

相关内容

最新更新