Скажите, у меня есть следующий код.Пожалуйста ознакомтесь.Я добавил свои вопросы ниже:
Mybatis Config:
@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)
}
}
IЯ предполагаю, что в приведенном выше примере, если бы кто-то вызвал этот метод
public addItems(List<Item> items){
for(Item item : items)
{
myDao.insertItem(item);
}
}
Он был бы менее производительным, чем вызов:
public addItemsBulk(List<String> items){
myDao.insertItems(items)
}
... потому что для каждой итерациицикл for произойдет следующее:
- Шаблон сеанса использует фабрику сеансов
- Фабрика сеансов создает сеанс, открывая соединение.
- Фабрика сеансовсоздает транзакцию
- фабрика сессий выполняет вставку
- фабрика сессий фиксирует транзакцию
- фабрика сессий закрывает сессию
^ Так в этом примере Я предполагаю , что в случае метода, содержащего цикл for, будет несколько сессий, по одному на каждую вставку, с транзакцией на сессию.
Теперь что произойдет, еслиповерх класса MyService я добавил @ Transactional аннотация?
Я предполагаю, что производительность будет одинаковой и что порядок событий будет в обоих случаях:
- Используется шаблон сеансаФабрика сеанса
- Фабрика сеанса создает сеанс, открывая соединение.
- Фабрика сеанса создает транзакцию
- Фабрика сеанса выполняет ВСЕ операторы вставки
- Фабрика сеанса фиксирует транзакцию
- Session Factory закрывает сессию
^ Так что в этом примере Я предполагаю , что в случае метода, содержащего цикл for, будет один сеанси одна транзакция.
Правильно ли я рассуждаю или это неверно?