简体   繁体   English

MyBatis不持久化存储过程调用

[英]MyBatis Not Persisting Stored Procedure Call

I am using Spring 4 with MyBatis 3. I am calling a stored procedure in Oracle 11g which processes a bunch of data from a staging table and inserts the data into several other tables. 我将Spring 4与MyBatis 3一起使用。我正在Oracle 11g中调用一个存储过程,该存储过程处理临时表中的一堆数据并将该数据插入其他几个表中。 The stored procedure calls commit inside it. 存储过程调用在其中进行提交。 However nothing is being persisted, there are no exceptions or warnings, nothing in the logs except this. 但是,没有任何内容可以保留,没有异常或警告,除了此以外,日志中没有任何内容。

11:59:48.297 DEBUG BaseJdbcLogger.debug - ==>  Preparing: {call PKG_DIRECTORY.sp_process_staged_data} 
11:59:48.318 DEBUG BaseJdbcLogger.debug - ==> Parameters: 

Here is my definition in my mapper file 这是我在映射器文件中的定义

<insert id="processDirectory" statementType="CALLABLE">
    {call PKG_DIRECTORY.sp_process_staged_data}
</insert>

Here is the interface 这是界面

public interface StagedDataMapper {

    @Async
    void processDirectory();

    List<StageDirectory> getStagedDirectory(long institutionId);

    List<StageAppointment> getStagedAppointment(long institutionId);
}

I've tried insert, update, select, nothing works. 我试过插入,更新,选择,没有任何效果。

UPDATE: 更新:

I found a tiny mistake however it did not correct the issue. 我发现了一个小错误,但是并没有解决问题。

Updated mapper file 更新了映射器文件

<select id="processDirectory" statementType="CALLABLE">
    {call PKG_DIRECTORY.sp_process_staged_data()}
</select>

I can run call PKG_DIRECTORY.sp_process_staged_data() on the database directly and it works just fine. 我可以直接在数据库上运行调用PKG_DIRECTORY.sp_process_staged_data(),它可以正常工作。

Update 2: 更新2:

Here is my MyBatis config: 这是我的MyBatis配置:

@Configuration
public class PersistenceConfig {

    @Autowired
    Environment environment;

    @Bean(name = "datasource")
    public ComboPooledDataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(environment.getRequiredProperty("c3p0.driver"));
        dataSource.setJdbcUrl(environment.getRequiredProperty("c3p0.url"));
        dataSource.setUser(environment.getRequiredProperty("c3p0.user"));
        dataSource.setPassword(environment.getRequiredProperty("c3p0.password"));
        dataSource.setInitialPoolSize(environment.getRequiredProperty("c3p0.initialPoolSize", Integer.class));
        dataSource.setMaxPoolSize(environment.getRequiredProperty("c3p0.maxPoolSize", Integer.class));
        dataSource.setMinPoolSize(environment.getRequiredProperty("c3p0.minPoolSize", Integer.class));
        dataSource.setAcquireIncrement(environment.getRequiredProperty("c3p0.acquireIncrement", Integer.class));
        dataSource.setMaxStatements(environment.getRequiredProperty("c3p0.maxStatements", Integer.class));
        dataSource.setMaxIdleTime(environment.getRequiredProperty("c3p0.maxIdleTime", Integer.class));
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("org.something.core.domain");
        return sessionFactory.getObject();
    }

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager dataSourceTransactionManager() throws PropertyVetoException{
        return new DataSourceTransactionManager(dataSource());
    }

}

And my mapper 还有我的地图绘制者

<insert id="processDirectory" statementType="CALLABLE">
    {CALL PKG_DIRECTORY.SP_PROCESS_STAGED_DATA()}
</insert>

Update 3: 更新3:

I made another attempt but still no luck. 我做了另一次尝试,但还是没有运气。 Thinking about ditching MyBatis this is becoming such an issue. 考虑放弃MyBatis,这已成为一个问题。

Changed my persistence config a bit 改变了我的持久性配置

public class PersistenceConfig {

    @Autowired
    Environment environment;

    @Bean(name = "datasource")
    public ComboPooledDataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(environment.getRequiredProperty("c3p0.driver"));
        dataSource.setJdbcUrl(environment.getRequiredProperty("c3p0.url"));
        dataSource.setUser(environment.getRequiredProperty("c3p0.user"));
        dataSource.setPassword(environment.getRequiredProperty("c3p0.password"));
        dataSource.setInitialPoolSize(environment.getRequiredProperty("c3p0.initialPoolSize", Integer.class));
        dataSource.setMaxPoolSize(environment.getRequiredProperty("c3p0.maxPoolSize", Integer.class));
        dataSource.setMinPoolSize(environment.getRequiredProperty("c3p0.minPoolSize", Integer.class));
        dataSource.setAcquireIncrement(environment.getRequiredProperty("c3p0.acquireIncrement", Integer.class));
        dataSource.setMaxStatements(environment.getRequiredProperty("c3p0.maxStatements", Integer.class));
        dataSource.setMaxIdleTime(environment.getRequiredProperty("c3p0.maxIdleTime", Integer.class));
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("org.something.core.domain");
        sessionFactory.setTransactionFactory(springManagedTransactionFactory());
        return sessionFactory.getObject();
    }

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager dataSourceTransactionManager() throws PropertyVetoException{
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SpringManagedTransactionFactory springManagedTransactionFactory() {
        return new SpringManagedTransactionFactory();
    }

}

Rolled mybatis version from 3.3.0 down to 3.2.8 and mybatis-spring from 1.2.3 down to 1.2.2. 将mybatis版本从3.3.0降低到3.2.8,并将mybatis-spring从1.2.3降低到1.2.2。

Mapper looks like this: 映射器如下所示:

public interface StagedDataMapper {

    void processDirectory();

    List<StageDirectory> getStagedDirectory(long institutionId);

    List<StageAppointment> getStagedAppointment(long institutionId);
}

Controller method 控制器方式

@Transactional
    @RequestMapping(value = "/directory/process", method = RequestMethod.POST)
    public ResponseEntity processStagedDirectory() {
        stagedDataMapper.processDirectory();
        return new ResponseEntity(HttpStatus.ACCEPTED);
    }

Not sure what but the following works 不知道是什么,但是以下工作

<insert id="processDirectory" statementType="CALLABLE">
    <![CDATA[{ CALL PKG_DIRECTORY.SP_PROCESS_STAGED_DATA() }]]>
</insert>

This does not 这不

<insert id="processDirectory" statementType="CALLABLE">
    { CALL PKG_DIRECTORY.SP_PROCESS_STAGED_DATA() }
</insert>

MyBatis seems to rollback all query that are not explicit UPDATE or DELETE. MyBatis似乎回滚所有不是显式UPDATE或DELETE的查询。

For me, the solution was to add the property commitRequired="true" to the . 对我来说,解决方案是将属性commitRequired =“ true”添加到中。 Not sure how this translate to your situation but it seems to be the same problem. 不知道如何将其转换为您的情况,但似乎是同样的问题。

Exemple coming from LSC-Project (which use MyBatis): 来自LSC-Project(使用MyBatis)的示例:

  <transactionManager type="JDBC" commitRequired="true">
    <dataSource type="SIMPLE">
      <property value="${driver}" name="JDBC.Driver" />
      <property value="${url}" name="JDBC.ConnectionURL" />
      <property value="${username}" name="JDBC.Username"/>
      <property value="${password}" name="JDBC.Password"/>
      <property value="15" name="Pool.MaximumActiveConnections"/>
      <property value="15" name="Pool.MaximumIdleConnections"/>
      <property value="1000" name="Pool.MaximumWait"/>
    </dataSource>
  </transactionManager>

Quite an old question, but the obvious answer is not there. 这是一个很老的问题,但是没有明显的答案。 Just change 只是改变

<select ... </select>;

to

<update ... </update>

This signals MyBatis to honor the transactional behaviour. 这标志着MyBatis尊重交易行为。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM