Вы имеете в виду проверенные исключения , то есть они должны быть объявлены или обработаны. Стандартная конструкция для работы с файлами в Java выглядит примерно так:
InputStream in = null;
try {
in = new InputStream(...);
// do stuff
} catch (IOException e) {
// do whatever
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
}
}
}
Является ли это уродливым? Конечно. Это многословный? Конечно. Java 7 сделает его немного лучше с блоками ARM, но до тех пор вы застряли с указанным выше.
Вы также можете разрешить обработчику исключений:
public void doStuff() throws IOException {
InputStream in = new InputStream(...);
// do stuff
in.close();
}
, хотя даже то close()
следует, вероятно, обернуть в блок finally
.
Но указанное выше объявление функции говорит, что этот метод может выдать IOException
. Поскольку это проверенное исключение, вызывающей стороне этой функции потребуется catch
это (или объявить ее так, чтобы ее вызывающий мог справиться с ней и т. Д.).
Добавить к другим ответам, sp_lock
может также использоваться для дампа полной информации о блокировке обо всех рабочих процессах. Вывод может быть подавляющим, но если Вы хотите знать точно, что заблокировано, это - ценное для выполнения. Я обычно использую его наряду с sp_who2
быстро обнулять в при блокировке проблем.
Существует несколько различных версий "более дружественных" sp_lock
процедуры, доступные онлайн, в зависимости от версии рассматриваемого SQL Server.
В Вашем случае, для SQL Server 2005, sp_lock
все еще доступно, но удержанный от использования, таким образом, теперь рекомендуется использовать sys.dm_tran_locks
представление для такого рода вещи. Можно найти пример как к "самокрутке" sp_lock функция здесь.
Можно также использовать встроенное sp_who2
хранимая процедура для получения текущих заблокированных и блокирующихся процессов на экземпляре SQL Server. Обычно Вы выполнили это вместе с экземпляром SQL Profiler, чтобы найти, что блокирование обрабатывает и смотрит на новую команду что spid, выпущенный в профилировщике.
Это точно не показывает Вам, какие строки заблокированы, но это может полезный Вам.
Можно проверить, какие операторы заблокированы путем выполнения этого:
select cmd,* from sys.sysprocesses
where blocked > 0
Это также скажет Вам, на чем ожидает каждый блок. Таким образом, можно проследить это полностью для наблюдения, какой оператор вызвал первый блок, который вызвал другие блоки.
Редактирование для добавления комментария от @MikeBlandford:
Заблокированный столбец указывает на spid процесса блокирования. Можно работать, уничтожают {spid} для фиксации его.
Я использую динамическое представление управления (DMV) для захвата блокировок, а также object_id или partition_id элемента, который заблокирован .
(ДОЛЖЕН переключиться на базу данных, за которой вы хотите наблюдать, чтобы получить object_id)
SELECT
TL.resource_type,
TL.resource_database_id,
TL.resource_associated_entity_id,
TL.request_mode,
TL.request_session_id,
WT.blocking_session_id,
O.name AS [object name],
O.type_desc AS [object descr],
P.partition_id AS [partition id],
P.rows AS [partition/page rows],
AU.type_desc AS [index descr],
AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT
ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O
ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P
ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU
ON AU.allocation_unit_id = TL.resource_associated_entity_id;