当前位置: 首页 > 知识库问答 >
问题:

spring中jdbctemplate和事务管理的Java配置

拓拔富
2023-03-14

我正在使用带有spring jdbc事务支持的spring jdbc。

这是我的配置。

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@EnableGlobalMethodSecurity(securedEnabled = true)
@PropertySource(name = "props", value = { "classpath:common/jdbc.properties", "classpath:common/mail.properties",
        "classpath:common/message.properties", "classpath:common/common.properties" })
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${jdbc.url}")
    private String jdbcURL;

    @Value("${jdbc.username}")
    private String jdbcUsername;

    @Value("${jdbc.password}")
    private String jdbcPassword;

    @Value("${jdbc.driver}")
    private String jdbcDriver;

    /**
     * configure jdbc datasource
     * 
     * @return DataSource
     */
    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource(jdbcURL, jdbcUsername, jdbcPassword);
        dataSource.setDriverClassName(jdbcDriver);
        return dataSource;
    }

    /**
     * configure jdbc template
     * 
     * @return JdbcTemplate
     */
    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(getDataSource());
    }

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(getDataSource());
    }
}

使用这个配置,事务对我来说不起作用。我不确定原因,但我能理解的是-

如您所见,jdbcTemplate()和txManager(),这两个方法都调用getDataSource()方法,该方法inturn创建JDBCDataSource。我认为在这两个方法中,我都创建了两个jdbc数据源,因此jdbcTemplate和transaction manager都使用了两个不同的数据源。

所以我的问题是-

  1. jdbcTemplate和transactionManager使用两个不同的数据源是真的吗?@bean可以处理这种情况。
  2. 如果它们都使用两个不同的数据源,那么如何配置它们以使它们使用相同的数据源。

共有1个答案

冯曾笑
2023-03-14

答案

  1. @bean处理这个问题。由于在类之上有@configuration,所以您在full(相对于lite)模式下操作,因此Spring会截获那些带有java@Bean注释的方法,并确保该方法只被调用一次。顺便说一句,我将它称为dataSource()而不是getDataSource(),因为方法名是bean名的。如果有疑问,请进行一些日志记录,并查看控制台以确认。
  2. 问题2。变得无关紧要。

为什么你的交易不起作用?这很难说,因为您没有提供它无法工作的完整上下文,但需要考虑一些事情:

    null
 类似资料:
  • 我在oracle中有两个数据源和两个模式,我正在执行unittest,但失败了。我想如果第二个事务失败,那么它应该回滚第一个TrasAction。下面是我的代码。 XML java.lang.IllegalStateException:无法激活事务同步-已在org.springframework.transaction.support.TransactionSynchronizationManag

  • 问题内容: 您好我已经面对一堵墙,而我试图使用Spring 3.x和hibernate4.做交易管理 我搜索在互联网上,但有办法在hibernate3要做到这一点,没有那么多的hibernate4. I”我很困惑,我不确定此设置是否有效。 我正在使用的东西… Spring 3.x Hibernate 4 我已经阅读了这些 http://static.springsource.org/spring/

  • 在我的spring服务中,我调用了两个spring数据存储库方法 现在我的查询与事务管理相关。就我所了解和看到的代码而言,spring存储库使用@Transactional为其方法启用了事务。对于select操作,它的readonly=true。 我对事务的理解是,当执行选择操作时,会创建一个事务,然后为保存操作创建另一个事务,因为对于选择操作,事务只读=true。 我希望在单个事务中执行读写操作

  • 问题内容: 我刚刚开始使用spring和hibernate进行项目。我的DAO图层类扩展了HibernateDaoSupport。我们没有使用注释。之前,我们使用了struts,因此我们使用了Session类提供的getTransaction,commit,rollback ..方法。我的要求非常简单,对于所有DAO类,如果有异常,则回滚,否则提交。请提出介绍spring交易管理的最简单方法。 问

  • Spring Transaction不支持多线程,所以我尝试在thread的run()方法中手动管理事务。但是,没用! 我想在下面的示例中回滚每个线程的run()方法,当其中有异常抛出时。(在以下情况下,插入到UNKNOWN_TABLE) 我的预期结果是“开始,1,3,5,结束”。 而实际结果是‘开始,1,2,3,4,5,结束’。 欢迎任何回复!谢谢! 主要类别: 服务等级:

  • 问题内容: 我正在使用Callable接口在serviceImpl中编写多线程程序。我正在使用spring事务管理器。在DB中执行更新操作时,它会成功执行。但是更新后的数据不会反映在DB中。但是,当我运行不带多线程的程序时,它将在DB中更新。 这是我的配置 我可以转向事务管理器的另一种方法。只是我想确认这种方法是否支持多线程。所以我的问题是 spring事务管理器是否支持多线程(我的意思是仅通过声