.NET класс SqlConnection, организация пула подключений и логика повторного соединения

Давайте ответим на это на примере:

class NonThreadSafe {

    private int counter = 0;

    public boolean countTo10() {
        count = count + 1;
        return (count == 10);
    }

Метод countTo10 добавляет единицу к счетчику и затем возвращает true, если счетчик достиг 10. Он должен возвращать true только один раз.

Это будет работать, пока только один поток выполняет код. Если два потока запускают код одновременно, могут возникнуть различные проблемы.

Например, если count начинается с 9, один поток может добавить 1 к счету (делая 10), но затем второй поток может войти в метод и снова добавить 1 (делая 11), прежде чем первый поток сможет выполнить сравнение с 10. Затем оба потока выполняют сравнение и обнаруживают, что счетчик равен 11, и ни один из них не возвращает true.

Так что этот код не является потокобезопасным.

По сути, все проблемы с многопоточностью вызваны некоторой вариацией такого рода проблем.

Решение состоит в том, чтобы гарантировать, что сложение и сравнение не могут быть разделены (например, путем окружения двух операторов каким-либо кодом синхронизации) или путем разработки решения, которое не требует двух операций. Такой код будет поточно-ориентированным.

8
задан Paul Hollingsworth 29 June 2009 в 14:20
поделиться

2 ответа

Like Kendall said, including the key on the device is basically asking to get cracked. However, there are folks who have their reasons for obfuscating data with a key on-device. If you're determined to do it, you might consider using SQLCipher for your implementation. It's a build of SQLite that provides transparent, page-level encryption of the entire DB. There's a tutorial over on Mobile Orchard for using it in iPhone apps.

не является неэффективным для создания множества объектов SqlConnection и закрытия каждого из них, когда вы закончите. Это именно то, что нужно делать. Пусть пул соединений .NET Framework сделает свое дело - не пытайтесь делать это самостоятельно. Вам не нужно делать ничего особенного, чтобы включить пул соединений (хотя вы можете отключить его, установив Pooling = false в строке подключения).

Есть много вещей, которые могут пойти не так, если вы попытаетесь чтобы кешировать соединение самостоятельно. Просто скажи нет :)

Для включения пула подключений ничего делать не нужно (хотя вы можете отключить его, установив Pooling = false в строке подключения).

Есть много вещей, которые могут пойти не так, если вы попытаетесь кэшировать подключите себя. Просто скажи нет :)

Для включения пула подключений ничего делать не нужно (хотя вы можете отключить его, установив Pooling = false в строке подключения).

Есть много вещей, которые могут пойти не так, если вы попытаетесь кэшировать подключите себя. Просто скажи нет :)

20
ответ дан 5 December 2019 в 07:13
поделиться

Вы должны включить пул соединений в строке соединения. В этом случае среда выполнения добавит ваши соединения обратно в «пул», когда вы их закроете, вместо того, чтобы действительно отключать. Когда «новое» соединение извлекается из пула, оно будет сброшено (т.е. вызывается sp_reset_connection), а затем представлено вашему приложению как совершенно новое, свежее соединение. Пул прозрачно обрабатывает такие случаи, как если бы соединение было закрыто во время простоя в пуле.

Стоимость создания нового соединения «с нуля» значительна, поскольку для аутентификации требуется несколько циклов туда и обратно между клиентом и сервером (в зависимости от метода аутентификации и настроек SSL, в лучшем случае это может быть 1 обратный путь, а в худшем - около 10. ).

И чтобы ответить на ваш вопрос,

2
ответ дан 5 December 2019 в 07:13
поделиться