2012-05-21 3 views
1

У меня есть следующий запрос:Следующий простой запрос не завершен. Подготовлено заявление

String updatequery = "UPDATE tbl_page SET linkCount = ?, pageProcessed = 1 WHERE pageUrl =?"; 
PreparedStatement updatestmt = kon.prepareStatement(updatequery); 
updatestmt.clearParameters(); 
//updatestmt.setQueryTimeout(10); 
updatestmt.setInt(1, linkCount); 
updatestmt.setString(2, urlLink); 
updatestmt.executeUpdate(); 

Когда я установить тайм-аут запроса в течение 10 секунд, он будет ловить исключение запроса истекло. но когда я не буду ждать. Что не так с запросом? pageUrl столбец является основным ключом с varchar(900)

Я знаю, что что-то может быть неправильно с подготовленным оператором, потому что, когда я запускаю этот запрос в MS SQl Server Management Studio ('?' Заменен его значением), он отлично работает.

Я что-то пропустил в Java или MSSQL?

+0

У вас есть другие вопросы, которые работают правильно через JDBC? – cheeken

+0

Да только этот проблематичен. –

+1

Производительность, столбцы VARCHAR более 4 не являются идеальными. Это один из случаев, когда я предлагаю использовать столбец INT 'ID' в качестве первичного ключа и использовать ограничение UNIQUE в столбце URL-адреса –

ответ

1

Создание индекса на PAGEURL:

create index tbl_page_pageUrl_index on tbl_page(pageUrl); 

Это позволит быстрый доступ к строкам, которые вы хотите обновить.

Без этого индекса база данных должна выполнять полное сканирование таблицы и в сочетании с командой update, если это может привести к конфликту блокировки и, возможно, даже к взаимоблокировкам, в зависимости от ваших параметров блокировки.

+1

Я думаю, что это уже ПК, угадывая, что он ошибся «urlLink». –

+0

извините за ошибку. 'pageUrl' является PK в tbl_page –

2

Поскольку код выглядит просто замечательно, это может быть проблемой на стороне базы данных. Может быть кто-то другой заблокировал строку, обновив ее и не выполнив фиксацию/откат (возможно, от вас, студия MS-SQL Server Management!). Вы можете искать блокировки, принадлежащие другим процессам, для одной записи, чтобы вы могли быть уверены, что это не проблема с базой данных.

+0

спасибо. объект соединения не был закрыт в другом классе. –

Смежные вопросы