-1

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

1)如果我们Spring Data总是听说Spring JDBC
Spring 框架有一些项目,比如Spring MVCSpring Security等等。
首先我尝试Spring JDBC在 Spring 的主页上找到,但没有找到。而不是我找到了Spring Data项目。经过一些研究,我发现了子项目中Spring Data使用的内容,最后有一些具体的操作对我来说很有趣。我意识到什么没有看到或听到任何使用或看到教程中的参考。真的有什么不好的吗? Spring JDBCJDBC ExtensionsoracleSpring Data

2)我应该每次创建 JdbcTemplate 的新实例
Next 是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方法的开始。在方法的末尾,我们有 line 。因此,我如何理解它,我在方法中放置的所有内容都将在单个事务中执行。但是如何在其他方法中执行具有相同事务的其他 s 呢?它限制了编写具有复杂逻辑的客户端。我的意思是所有逻辑都必须采用一种方法?我想这不可能是真的。 我所说的复杂逻辑是什么意思。例如,我有自己的模板方法。TransactionTemplatetransactionManager.getTransaction(this)executethis.transactionManager.commit(status)doInTransactionDAO

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

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

谢谢阅读。

4

3 回答 3

1

关于 JdbcTemplate:

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

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

于 2013-03-07T10:25:24.333 回答
0

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

于 2013-03-07T10:29:11.867 回答
0

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

于 2013-03-07T10:52:03.380 回答