Я еще об этом подумал, и ты можешь игнорировать мой предыдущий ответ. Это решение является излишне сложным. Я получил возможность сосредоточиться на возвращении &mut Self
из put
, хотя об этом вообще не просили. Вы можете просто вернуть &mut RequestInfo
из вашего метода put
, и все в порядке. Единственная цена, которую вы платите, это то, что вы больше не можете иметь реализацию по умолчанию для put
.
pub trait RequestInfo {
fn put(self: &mut Self, string: String) -> &mut dyn RequestInfo;
}
struct LoggedOut {}
impl RequestInfo for LoggedOut {
fn put(self: &mut Self, string: String) -> &mut dyn RequestInfo {
self
}
}
struct LoggedIn {
output: Vec<String>,
}
impl LoggedIn {
fn new() -> LoggedIn {
LoggedIn { output: Vec::new() }
}
}
impl RequestInfo for LoggedIn {
fn put(self: &mut Self, string: String) -> &mut dyn RequestInfo {
self.output.push(string);
self
}
}
fn get(flag: bool) -> Box<dyn RequestInfo> {
if flag {Box::new(LoggedIn::new())} else {Box::new(LoggedOut{})}
}
fn main() {
let mut info = get(false);
info.put("abc".to_string()).put("def".to_string());
}
Нет. Необходимо будет использовать SQL Profiler. Стандартная трассировка с событием Lock Timeout и событиями Deadlock Graph должна сделать это.
Аппаратные средства в стороне (такие как достаточно RAM и быстро управляет, и соответствующее размещение Файлов данных и Файлов журнала на соответствующих конфигурациях RAID) большинство тайм-аутов вызываются, не имея sufficently 'хороший' набор индексов для Вашей рабочей нагрузки.
Вам планировали планы ведения индексов регулярно?
Вы могли также использовать Уведомления о событии, которые повышены на событиях мертвой блокировки и тайм-ауте. После того, как это будет стрелять, можно записать это в таблицу и или послать себе электронное письмо.
Я показал общую технику здесь:
Непосредственные уведомления о мертвой блокировке, не изменяя существующий код
18 июля 2008
Таким образом, Вы не должны выполнять Профилировщика; который может повлиять на производительность.