簡體   English   中英

Mybatis Spring-交易管理

[英]Mybatis Spring - Transaction Management

說我有以下代碼。 請查閱。 我在下面添加了我的問題:

Mybatis配置:

@Configuration
@ConfigurationProperties
public class MyMybatisConfiguration{

     @Bean
     public DataSource datasource(){
        //configure some db
     }

     @Bean
     public SqlSessionFactory sessionFactory(){
         SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
         ssfb.setDataSource(dataSource())
         return ssfb;
     }

     @Bean
     public SqlSessionTemplate sessionTemplate(){
         return new SqlSessionTemplate(sessionFactory());
     }


 }

服務層:

@Service
public class MyService{

    public MyDao myDao;

    public MyService(MyDao myDao){
       this.myDao = myDao;
    }

    public addItems(List<Item> items){

       for(Item item : items)
       {
           myDao.insertItem(item);
       }  

    }

    public addItemsBulk(List<String> items){

        myDao.insertItems(items)

    }

}

道層:

 @Repository
 public class MyDao {

      private SqlSessionTemplate tmp;

      @Autowired
      public MyDao(SqlSessionTemplate tmp){
          this.tmp = tmp;
      }


      public insertItem(Item item){
         sst.insert("insertItem", item)
      }

      public insertItems(List<Item> items){
         sst.insert("insertItems", items)
      }

    }

我假設在上面的示例中,如果有人調用了此方法

public addItems(List<Item> items){

  for(Item item : items)
  {
       myDao.insertItem(item);
  }  

}

它的性能不如調用:

 public addItemsBulk(List<String> items){

     myDao.insertItems(items)

 }

...由於for循環的每次迭代都會發生以下情況:

  1. 會話模板使用會話工廠
  2. 會話工廠創建會話,打開連接。
  3. 會話工廠創建事務
  4. 會話工廠執行插入
  5. 會話工廠提交事務
  6. 會話工廠關閉會話

^因此,在此示例中, 我假設在包含for循環的方法中,將存在多個會話,每個插入一個會話,每個會話有一個事務。


現在,如果在MyService類的頂部添加了@Transactional注釋,會發生什么情況?

我假設性能是相同的,並且在兩種情況下這都是事件的順序:

  1. 會話模板使用會話工廠
  2. 會話工廠創建會話,打開連接。
  3. 會話工廠創建事務
  4. 會話工廠執行所有插入語句
  5. 會話工廠提交事務
  6. 會話工廠關閉會話

^因此,在此示例中, 我假設在包含for循環的方法中,將有一個會話和一個事務。

我的推理正確嗎?還是有缺陷?

您的問題與@Transactional無關,但與Mybatis的Executor.BATCH的用法有關(與prepareStatement.executeBatch()等效)

比較原始解決方案和以下設置之間的區別:

將ExecutorType.BATCH添加到SqlSessionTemplate中:

@Configuration
@ConfigurationProperties
public class MyMybatisConfiguration{

     ...

     @Bean
     public SqlSessionTemplate sessionTemplate(){
         return new SqlSessionTemplate(sessionFactory(), ExecutorType.BATCH);
     }

 }

聲明方法flushStatements:

@Repository
public class MyDao {
      ....
      public flush(){
         sst.flushStatements();
      }
}

將刷新添加到addItems

public addItems(List<Item> items){

  for(Item item : items)
  {
       myDao.insertItem(item);
       myDao.flush();
  }  

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM