我正在嘗試使用 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
提交
取消