Пул соединений ODP.NET: как узнать, использовалось ли соединение - PullRequest
2 голосов
/ 21 октября 2011

Я изменяю приложение Winforms для использования пула соединений, чтобы доступ к данным мог происходить в фоновых потоках.Бизнес-логика реализована в PL / SQL, и для использования бизнес-логики необходимо вызвать несколько хранимых процедур, связанных с безопасностью.

Мне нужен способ определить, является лисоединение было использовано без обратной передачи в базу данных.Я не думаю, что смогу отслеживать их в HashSet, потому что сомневаюсь, что на Equals или даже ReferenceEquals можно было бы положиться.Любые идеи?

РЕДАКТИРОВАТЬ:

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

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Пул соединений, предоставляемый ODP.NET, полностью непрозрачен. То есть, это не утечка в том виде, в каком я хотел бы - нет никакого способа узнать, использовалось ли ранее соединение или оно совершенно новое. Однако это утечка абстракции по-другому: любое состояние сеанса (например, переменные области пакета, которые являются областью сеанса) сохраняется между использованиями соединения. Поскольку это вопрос определения используемого и нового состояния соединения без обращения к базе данных , ответ заключается в том, что это просто невозможно сделать с помощью встроенного пула соединений ODP.NET.

Это оставляет два варианта:

  1. Создание реализации пула соединений, которая либо предоставляет эту информацию, либо выполняет пользовательскую инициализацию при создании каждого нового соединения; или
  2. Выполните обход в базу данных, чтобы определить используемое или новое состояние соединения.
0 голосов
/ 08 марта 2013

Если вам нужно просто узнать, были ли у вас какие-то соединения не из пула, а из нового, я думаю, вы можете использовать счетчик производительности HardConnectsPerSecond и SoftconnectsPerSecond, предоставляемый ODP.NET.

Это не скажет вам, какой именно OracleConnection.Open () приводит к жесткому соединению.Я также думал о том, чтобы объединить другой счетчик производительности ODP.NET, чтобы определить, создано ли новое жесткое соединение, но после некоторых экспериментов это не легко, потому что ODP.NET также будет очищать соединения каждые три минуты (в зависимости от настройки Decr Pool Size).

0 голосов
/ 21 октября 2011

ADO.NET управляет пулом соединений для вас.Это даже настраивается.Зачем вам когда-нибудь пытаться отслеживать эти соединения самостоятельно?

http://msdn.microsoft.com/en-us/library/bb399543.aspx

И, в частности, для Oracle:

http://msdn.microsoft.com/en-us/library/ms254502.aspx

Поставщик данных .NET Framework для Oracle автоматически обеспечивает пул соединений для клиентского приложения ADO.NET.Вы также можете предоставить несколько модификаторов строки подключения для управления поведением пула соединений (см. «Управление пулами соединений с помощью ключевых слов строки соединения» далее в этом разделе).

Создание и назначение пула

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

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

Кстати, я полагаю, что я не совсем в восторге от всех происходящих изменений OracleClient.Похоже, Microsoft отказывается от поддержки?Последнее, что я знал, что ODP.NET был основан на ADO.NET ... но, даже если я ошибаюсь по этому поводу, ODB.NET заявляет о поддержке пула подключений также из коробки:

http://download.oracle.com/docs/html/E10927_01/featConnecting.htm#CJAFIDDC

...