【问题标题】:spring jdbc + PlatformTransactionManager + spring data + theory [closed]spring jdbc + PlatformTransactionManager + spring数据+理论[关闭]
【发布时间】:2013-03-07 10:13:11
【问题描述】:

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

1) 如果我们有Spring Data,为什么总是只听说Spring JDBC
Spring 框架有一些项目,如Spring MVCSpring 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...
}

他们还写在文档中

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

这是误导。为什么在setDataSource 方法中创建新实例,如果他们可以将dataSource 放入已经创建的实例中,或者我误解了它?

3) 我们如何使用TransactionTemplate 编写复杂的客户端逻辑?
TransactionTemplate 另一个模板与TransactionStatus 一起使用。据我了解,它可以帮助我管理我的交易有多大帮助? 在TransactionTemplateexecute 方法的开头,我们有transactionManager.getTransaction(this)。在execute 方法的末尾,我们有this.transactionManager.commit(status) 行。因此,我如何理解它,我在doInTransaction 方法中放置的所有内容都将在单个事务中执行。但是如何在其他方法中使用相同的事务执行其他 DAOs 呢?它限制了编写具有复杂逻辑的客户端。我的意思是所有逻辑都必须采用一种方法?我认为这不可能是真的。
我所说的复杂逻辑是什么意思。例如我有自己的模板方法。

/*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()方法。

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

感谢阅读。

【问题讨论】:

    标签: java spring jakarta-ee spring-jdbc


    【解决方案1】:

    关于 JdbcTemplate:

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

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

    【讨论】:

    • 感谢您回答一个问题
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您需要意识到 Spring 已经存在 11 年了。它进化了。有很多项目最初是作为 Spring 的辅助项目,并被纳入其中。自 Rod Johnson 首次编写 Spring JDBC 以来,它就一直存在。 Spring Data 是最近的发展。

      【讨论】:

        猜你喜欢
        • 2015-09-19
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 2011-04-14
        • 2012-06-12
        • 1970-01-01
        相关资源
        最近更新 更多