Сценарий : у нас есть приложение, которое использует Oracle 10g и последнюю версию ODP.net в приложении ASP.net.Мы используем свойство .ClientID WriteOnly для объекта OracleConnection для передачи определенного идентификатора пользователя в базу данных для целей аудита.Когда пул соединений отключен, это работает отлично.
Когда он включен, первый пользователь, который входит в систему (например, USER1), обновляет запись, и MODIFIED_BY - это USER1, но когда другой пользователь отправляется на веб-сайт после этого, захватывая таким образом объединенное соединение, MODIFIED_BYвсе еще USER1, несмотря на передачу USER2 в ClientID.
Наша логика базы данных выглядит следующим образом:
Мы сохраняем класс в сеансе ASP.net, в котором есть наша логика подключения к базе данных.При первом вызове это наш конструктор:
Public Sub New(ByVal connection As String, Optional ByVal oracleClientID As String = "")
MyBase.New()
_oracleConnection = New OracleConnection(connection)
_clientID = oracleClientID
End If
End Sub
Суть кода для открытия и закрытия соединения, распоряжения:
Try
_OraCmd = New OracleCommand(command, _oracleConnection)
With _OraCmd
.BindByName = True
.Parameters.Clear()
.CommandType = CommandType.StoredProcedure
_oracleConnection.Open()
If _clientID <> "" Then _oracleConnection.ClientId = _clientID
Dim OraDadpt As New OracleDataAdapter(_OraCmd)
'' Logic to get data
OraDadpt.Fill(ds)
End With
Catch ex As Exception
Throw ex
Finally
ClearParameters()
_OraCmd.Dispose()
_oracleConnection.Close()
End Try
Суть в том, что, поскольку соединениеВ пуле есть предполагаемый вызов триггера LOGON, который никогда не происходит, и идентификатор клиента никогда не устанавливается снова.В документации ORACLE, однако, говорится, что ClientID используется именно для того, что мы пытаемся сделать.
Есть ли у кого-нибудь какие-либо мысли относительно того, почему для SYS_CONTEXT ('USERENV', 'CLIENT_IDENTIFIER') не установлено значениеновый USERID, который передается в ClientID, когда пул соединений используется в нашем приложении .NET с ODP.net?Это настройка базы данных, настройка слушателя?Мы будем благодарны за любую помощь.
ОБНОВЛЕНИЕ
Мы передали проблему в Oracle.При этом нам пришлось создать небольшое тестовое приложение, которое имитировало проблему.При этом на моем локальном хосте все работало идеально, используя встроенный веб-сервер Cassini в Visual Studio. В IIS проблема возникает.
ОБНОВЛЕНИЕ
Определено, что проблема не в IIS.Переменные пакета не очищались из-за того, что соединения, которые были объединены, были повторно использованы, по сути, то, что пул должен делать.Мы решили это с помощью DBMS_SESSION.MODIFY_PACKAGE_STATE (DBMS_SESSION.REINITIALIZE).