我正在使用mybatis-spring设置一个应用程序,该应用程序应执行几个sql语句(主要是selects)并将结果打印到控制台。
我的applicationContext.xml看起来像这样:
$posts = Post:all();
$user = []; // should be an array because you're looping over it.
foreach($posts as $post) {
$user[] = User::where('name', $post->creator)->get();
}
return view('welcome')->with('posts', $posts)->with('user', $user);
我注意到,每当我执行sql语句时,都会为该语句创建会话,并在执行后立即关闭。
有没有一种方法可以在一个会话中执行多个sql语句,直到所有方法/语句都执行完才关闭它?
谢谢。
答案 0 :(得分:1)
似乎没有正确划分事务,并且使用了默认行为(一次调用映射器-一次事务-一次mybatis会话)。
在spring-mybatis
中,绑定到春季交易的会话。如果未划分事务,则将为每次对mybatis映射器方法的调用创建一个事务(并因此创建mybatis SqlSession
)。
要更改此设置,您需要正确配置spring,以便:
有许多方法可以配置事务,有关详细信息,请参见documentation。我将在这里展示使用xml配置的简单方法。
首先,将事务管理器添加到spring配置中:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
然后,您需要指定交易边界。简单的方法是使用声明式事务管理:
将此添加到spring配置中
<tx:annotation-driven/>
然后在应该以事务方式执行的方法上使用@Transactional
批注:
@Service
class SomeService {
@Autowired MyMapper mapper;
@Transactional
SomeResult someMethod () {
Piece1 piece1 = mapper.getSome();
Piece2 piece2 = mapper.getMore();
SomeResult result = SomeResult(piece1, piece2);
}
}