我正在尝试使用 MyBatis 和 PostgreSQL 动态设置查询的锁定超时。我的映射器看起来像: @Select("SET LOCAL lock_timeout = '#{lockTimeout}s';" + "SELECT ......where id= #{myId} FOR UPDATE") MyObject select(@Param("lockTimeout") String lockTimeout, @Param("myId") String id);似乎参数不匹配,我得到了一个 org.postgresql.util.PSQLException: Index of column out of range : 2, number of column 1.@SelectProvider在我的情况下不匹配,因为我的参数锁定超时不是静态的。有谁知道如何动态设置参数锁定超时?
1 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
pgjdbc 似乎独立执行每个语句。
我不建议将多个语句放入单个映射器语句中,因为行为取决于驱动程序。
您应该声明两个方法并在同一会话/事务中调用它们。
@Update("select set_config('lock_timeout', #{lockTimeout}, true)")
void setLockTimeout(String lockTimeout);
@Select("SELECT ......where id= #{myId} FOR UPDATE")
MyObject select(@Param("myId") String id);
一些注意事项:
set_config()
被用作似乎SET LOCAL
不适用于 aPreparedStatement
。@Update
用于立即应用更改。如果您使用@Select
,您可能需要SqlSession#commit()
显式调用。与您的示例不同,该参数必须包含
s
iesetLockTimeout("1s")
。
如果您只想传递一个数字,#{lockTimeout} || 's'
应该可以。
添加回答
举报
0/150
提交
取消