gpt4 book ai didi

java - 使用 PreparedStatements 时 SQL Server 死锁

转载 作者:行者123 更新时间:2023-11-30 09:05:15 24 4
gpt4 key购买 nike

我有一个 java servlet 应用程序,我正在使用准备好的查询来更新 SQL Server 数据库表中的记录。

假设我想执行 UPDATE MyTable SET name = 'test' WHERE id = '10'。 (是的,id 是一个 varchar)
我使用以下代码实现了这一点:

PreparedStatement pstmt = con.prepareStatement("UPDATE MyTable SET name = ? WHERE id = ?");
pstmt.setString(1, getName() );
pstmt.setString(2, getID() );
pstmt.executeUpdate();

我发现当我运行 JMeter 脚本来模拟 2 个用户时,此语句会导致我的数据库出现死锁。

我想检查 SQL Profiler 中的值是什么,所以我使用了以下代码,这样我就可以检查这些值。

String query = String.format("UPDATE MyTable SET name = '%s' WHERE id = '%s' ", getName(), getID() );
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.executeUpdate();

突然间我的僵局消失了!遗憾的是,最后一种方法易受 SQL 注入(inject)攻击。

有没有人可以告诉我发生了什么和/或如何解决它?

最佳答案

好吧,我终于找到了问题所在和解决方案。

jTDS JDBC 驱动程序与 MSSQL 的组合似乎是“问题”。

This article准确说明了我的情况。在this FAQ的帮助下我能够将数据源设置为正确的配置。

据我了解:

如果您有使用类似字符串的索引的语句(就像我的情况),该表将执行索引 SCAN 而不是索引 SEEK。这会导致整个表被锁定并且容易发生死锁。

我希望这对其他人也有帮助。

关于java - 使用 PreparedStatements 时 SQL Server 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24911333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com