2013-03-07 87 views
-1

我开始学习工具包spring jdbc。在春天阅读一些关于transactions 的文档,结束它们的模板。尽管如此,一些常见的事情我不清楚。spring jdbc + PlatformTransactionManager + spring数据+理论

1)如果我们有Spring Data为什么总是听到只有约​​Spring JDBC
Spring框架有一些项目像Spring MVCSpring Security
首先,我试图找到Spring JDBC春的主站点,但不发现它。而不是我发现Spring Data项目。经过一番研究,我发现Spring Data使用Spring JDBCJDBC Extensions子项目和最后有一些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一起使用。据我了解,它可以帮助我管理我的交易有多大的帮助? 在execute方法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()方法。

但仍不清楚它是线程安全的?即我可以使用它,并确保所有来自jdbcTemplateJDBC s callableStatment.execute()方法的内部呼叫都将指向此并且仅限于此交易。并没有看到其他线程中的另一个事务。

感谢您的阅读。

回答

1

关于JdbcTemplate的:

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

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

+0

感谢您对一个问题的回答 – Mrusful 2013-03-07 11:52:13

0

只是还有一件事,请通过Spring Data Support视频。这些是学习JDBC模板基础的非常好的视频。

0

你需要认识到Spring已经存在了11年了。它是演变而来的。已经有许多项目开始作为春季的辅助项目,并已经融入其中。自从Rod Johnson首次撰写Spring JDBC以来,Spring JDBC就一直存在。 Spring Data是最近的一个发展。