2013-12-04 9 views
2

Безопасен ли этот код?Является ли эта фабричная нить NpgsqlConnection безопасной?

public static NpgsqlConnection getConnection() 
{   
    NpgsqlConnectionStringBuilder csb = new NpgsqlConnectionStringBuilder(); 
    csb.Host = ConfigurationManager.AppSettings["server"]; 
    csb.Password = ConfigurationManager.AppSettings["password"]; 
    csb.Pooling = true; 
    csb.UserName = ConfigurationManager.AppSettings["username"]; 
    csb.Port = Convert.ToInt32(ConfigurationManager.AppSettings["port"]); 
    csb.Enlist = true; 
    //csb.Database = ConfigurationManager.AppSettings["databaseName"]; 

    return new NpgsqlConnection(csb.ConnectionString); 
} 

Я использую эту связь везде, но иногда я получаю TimeoutException.

Произошел перерыв. Если вы установили соединение, увеличьте значение Timeout в ConnectionString. Если вы выполняете команду, увеличьте значение CommandTimeout в ConnectionString или в объекте NpgsqlCommand.

Любые идеи?

+0

Что такое 'csb', и где он определен? –

+0

updated @MarcGravell – GorillaApe

ответ

1

Нет, это не потокобезопасно, потому что csb не является локальным и, вероятно, не является потокобезопасным. Используйте локальный csb. Проверьте, является ли ConfigurationManager потокобезопасным.

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

+0

'ConfigurationManager' должен быть в порядке в самых разумных сценариях –

+0

Так что csb может вызвать проблемы? Хорошо, я попытаюсь. Хороший намек. Я сделал для оптимизации, но кажется совершенно бессмысленным, поскольку для создания класса потребуется меньше, чем наносекунда. http://npgsql.projects.pgfoundry.org/docs/api/Npgsql.NpgsqlConnectionStringBuilderMembers.html – GorillaApe

+0

ok Я снова проверил, и csb был локальным в моем проекте. Так что проблема - это еще что-то. – GorillaApe

4

Отвечая на ваш вопрос, NpgsqlConnection не является потокобезопасным. Вы не должны делиться NpgsqlConnection с несколькими потоками.

Но в отношении вашего исключения, если вы заметили, вы получите его, когда вы вызываете метод NpgsqlConnection.Open(). И в вашем методе getConnection() вы не вызываете Open. Вы открываете соединение где-то еще.

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

Вам нужно либо закрыть, либо закрыть объект NpgsqlConnection, чтобы он возвращался в пул соединений. Если вы позволяете экземпляру NpgsqlConnection выйти из области видимости, он не будет возвращен в пул и будет считаться использованным соединением.

Для того, чтобы проверить, если это ваша проблема, у вас есть две возможности:

  1. Отключить пул соединений. Вы больше не будете получать это исключение, но поскольку вы не закрываете соединения, вы можете в конечном итоге достичь максимальных подключений, разрешенных для каждой базы данных. Это параметр сервера postgresql.

  2. Позвоните в NpgsqlConnection.ClearPool или ClearAllPool, чтобы удалить все соединения из пула.

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

Надеюсь, это поможет.

+0

Спасибо за ответ. Я обновился до версии npgsql 2.0.13, и проблема, похоже, исправлена. Приложение havent разбилось на 6 дней, и когда это могло произойти, это не было из-за этого. Мониторинг соединений никогда не превышал размер пула. Думаю, это была ошибка? Не уверен... – GorillaApe

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