[英]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循環的每次迭代都會發生以下情況:
- 會話模板使用會話工廠
- 會話工廠創建會話,打開連接。
- 會話工廠創建事務
- 會話工廠執行插入
- 會話工廠提交事務
- 會話工廠關閉會話
^因此,在此示例中, 我假設在包含for循環的方法中,將存在多個會話,每個插入一個會話,每個會話有一個事務。
現在,如果在MyService類的頂部添加了@Transactional注釋,會發生什么情況?
我假設性能是相同的,並且在兩種情況下這都是事件的順序:
- 會話模板使用會話工廠
- 會話工廠創建會話,打開連接。
- 會話工廠創建事務
- 會話工廠執行所有插入語句
- 會話工廠提交事務
- 會話工廠關閉會話
^因此,在此示例中, 我假設在包含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.