2

java 서블릿 응용 프로그램이 있으며 준비된 쿼리를 사용하여 SQL Server 데이터베이스 테이블의 레코드를 업데이트하고 있습니다.PreparedStatements를 사용할 때 SQL Server 교착 상태가 발생했습니다.

UPDATE MyTable SET name = 'test' WHERE id = '10'을 실행하려고합니다. 내가 2 사용자를 시뮬레이션하기 위해 JMeter를 스크립트를 실행하는 동안,이 사항이 교착 상태에 원인이 있음을 발견

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

:
내가이 일어날 수 있도록 다음 코드를 사용 (예, ID는 VARCHAR입니다) 내 데이터베이스.

SQL 프로파일 러에 내 값이 무엇인지 확인하고 다음 코드를 사용하여 값을 확인할 수있었습니다.

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

갑자기 내 교착 상태가 사라졌습니다. 마지막 접근 방식이 SQL 인젝션에 취약하다는 것은 수치 스럽습니다.

나에게 어떤 일이 일어나고 있는지, 그리고/또는 어떻게 고칠 수 있는지 말해 줄 수있는 사람이 있습니까?

+0

교착 상태가 정확히 무엇입니까? 교착 상태라고 어떻게 판단 했습니까? – DavidG

+0

트랜잭션이 교착 상태 였다는 SQLException이 발생했습니다. – HansElsen

+0

교착 상태가 사라진 것은이 변경 사항 이었습니까? 나는 위와 같이 게시 한 SQL을 실행하면 교착 상태가 발생할 수있는 방법이 없음을 확신합니다. – DavidG

답변

3

오케이 마침내 문제와 해결책을 찾았습니다.

MSSQL과 jTDS JDBC 드라이버의 조합이 '문제'인 것으로 보입니다.

This article 내 상황을 정확하게 설명했습니다. 그리고 this FAQ의 도움으로 데이터 소스를 올바른 구성으로 설정할 수있었습니다. 내가 이해에서

: 당신은 문자열과 같은 인덱스를 사용하는 문이있는 경우

은 (처럼 내 상황에서), 테이블은 인덱스 스캔 대신 인덱스 SEEK을 수행합니다. 이로 인해 전체 테이블이 잠기고 교착 상태에 취약 해집니다.

다른 사람들에게도 도움이되기를 바랍니다.

+0

올바른 데이터 소스 구성이란 무엇입니까? – MAGx2