JdbcTemplate 为 RowCallbackHandler 提供空的 ResultSet,但为 ResultSetExtractor 提供非空的 ResultSet

JdbcTemplate provides empty ResultSet for RowCallbackHandler but a non-empty one for ResultSetExtractor

提问人:Aditya Taunk 提问时间:10/25/2023 更新时间:10/25/2023 访问量:13

问:

我正在尝试将一些数据从 MS SQL Server 数据库传输到 Postgres 数据库。我的计划是编写一个Spring Boot应用程序,该应用程序从一个数据源(mssql)读取记录并将它们插入到另一个数据源(postgres)中。在进入杂草之前,我想检查我的应用程序是否可以访问这两个数据库。这是我到目前为止所拥有的:

@Service
public class ScenarioTransferService
{
    @Autowired private JdbcTemplate srcTemplate;
    @Autowired private JdbcTemplate dstTemplate;

    public void handle()
    {
        srcTemplate.query("select plant from plant", rs ->
        {
            while (rs.next())
            {
                System.out.println("source plant: " + rs.getString(1));
            }
        });

        dstTemplate.query("select plant from plant", new ResultSetExtractor<Void>()
        {
            @Override
            public Void extractData(ResultSet rs) throws SQLException, DataAccessException
            {
                while (rs.next())
                {
                    System.out.println("destination plant: " + rs.getString(1));
                }
                return null;
            }
        });

        dstTemplate.query("select plant from plant", new RowCallbackHandler()
        {
            @Override
            public void processRow(ResultSet rs) throws SQLException
            {
                while (rs.next())
                {
                    System.out.println("destination plant: " + rs.getString(1));
                }
            }
        });
    }
}

请注意,我同时使用 ResultSetExtractor 和 RowCallbackHandler 查询 dstTemplate。其中每个都应该让我访问相同的基础 ResultSet,但是当我运行它时,我只从 ResultSetExtractor 获得输出,因为 RowCallbackHandler 给了我一个空的 ResultSet。

还值得注意的是,连接到 MS SQL Server 数据库的 srcTemplate 也使用 RowCallbackHandler,但作为 lambda,工作正常。只是 postgres RowCallbackHandler 不起作用,无论我是使用 lambda 还是直接调用它。有什么线索吗?

如果这是数据库连接问题,或者如果 postgres 数据库中确实没有数据,我希望 ResultSetExtractor 会给我相同的结果。

sql-server postgresql spring-boot 结果集 jdbctemplate

评论

0赞 AlwaysLearning 10/25/2023
您是否注意到 RowCallbackHandler 文档中的以下内容?此方法不应在 ResultSet 上调用 next();它只应该提取当前行的值。
0赞 Aditya Taunk 10/25/2023
就是这样!我在目标表中只有一行,而在源表中有多行。因此,即使我为源调用rs.next(),我也得到了结果,但在第一行之后我没有目标的结果。非常感谢!

答: 暂无答案