使用 JdbcTemplate 执行方法后,本地临时表 (SQL Server) 不会自动删除,但可以与 NamedParameterJdbcTemplate 一起使用?

Local temporary table(SQL Server) not dropping automatically after method execution with JdbcTemplate but works with NamedParameterJdbcTemplate?

提问人:aakash singh 提问时间:10/17/2023 最后编辑:aakash singh 更新时间:10/17/2023 访问量:37

问:

我正在尝试执行一个本机查询,我在其中创建了本地临时表。我的前端调用一个 Api,一个方法执行该查询。如果我再次调用该方法,有时我会得到数据库中已经存在的对象(#temptablename),如果我不断刷新我的前端,10 次中有 1 次可以工作。

这是复杂查询的简化形式,但您将了解我尝试执行的要点。

select * into #ts from (
    "some select query"
) as tmp1;

Select
    *
from
    #ts

此方法并非每次都有效。

jdbcTemplate.queryForList(查询);

这每次都有效。

namedParameterJdbcTemplate.queryForList(query, args);

namedParameterJdbcTemplate 中的 Args 是垃圾参数,因为此查询不需要任何参数。

我的预感是jdbcTemplate每次调用都使用相同的连接,因为本地临时表与连接相关联,并且namedParameterJdbcTemplate每次都会创建新连接。

我如何在@PostConstruct方法中创建数据源

DataSource dataSource = DataSourceBuilder.create().username(username).password(password)
                            .url(url + ";ApplicationIntent=ReadOnly").build();
jdbcTemplate.setDataSource(dataSource);
sql-server spring jdbc 名称参数jdbctemplate

评论

0赞 Thom A 10/17/2023
临时表在创建临时表的作用域结束后自动删除;这听起来像是你使用的是单个持久连接,因此临时表不会因为作用域没有结束而删除。
0赞 aakash singh 10/17/2023
不,我不是自己创建任何连接,连接是由 spring 本身管理的。我在名为Jdbc的对象和普通jdbc模板中都设置了数据源。如果我将数据返回到创建它的前端范围,它就结束了。
0赞 siggemannen 10/17/2023
这是非常糟糕的,它应该调用 sp_reset_connection以便如果它使用池,则表会被正确删除(参见 stackoverflow.com/questions/641120/...)。我猜你的设置是错误的,否则会有很多人遇到这个问题。也许您尝试使用一些通用的 jdbc 设置,以便它不知道 microsoft 特定的东西?
1赞 siggemannen 10/17/2023
你可以在这里读到一些东西:github.com/microsoft/mssql-jdbc/issues/1861
0赞 M. Deinum 10/17/2023
请说明您正在使用的数据源以及您如何调用此代码。不,范围还没有结束,特别是如果您使用连接池,则连接只是返回到池中。

答: 暂无答案