我正在尝试使用带有Spring Boot的MyBatis Cursor来迭代大型查询:
制图员:
@Mapper
@Repository
interface UserMapper {
@Select("SELECT * FROM huge_user_table")
Cursor<User> getUsers();
消费者:
@Component
public class UserProcessor {
@Autowired private UserMapper userMapper;
public boolean process() throws IOException {
Cursor<User> users = userMapper.getUsers();
//users.isOpen() == false
for (User user : users) {
//Never iterates
System.out.println(user.getId());
}
当我将光标关闭时,虽然它已关闭,但没有返回任何记录。
我错过了什么吗?
最有可能的问题是你试图在交易之外使用Cursor
。这不受支持。
Cursor
基本上是JDBC ResultSet
的包装器。为了从Cursor
获取值,应该打开底层的ResultSet
。如果在循环的整个持续时间内没有事务,则spring将在执行查询时打开连接(在您的情况下为getUsers
方法的持续时间)。方法完成后,连接关闭,因此ResultSet
使用的Cursor
也关闭。
将@Transactional
添加到process
,这应该可以解决问题。