| 

.NET C# Java Javascript Exception

1
mein Kunde hat eine strenge Policy bzgl. Datenbankzugriffen (er verwendet Oracle 10g). Jeder Anwender ist als User in Oracle angelegt. Er bekommt per default nur CONNECT-Rechte. Der Kunde hat eine allgemeine Logon-Komponente geschrieben, welche im Hintergrund eine Stored Procedure aufruft, die dem Anwender temporär eine Datenbank-Rolle zuweist, welche die von der Anwendung benötigten Rechte besitzt (das ganze wird über eine Konfigurationsdatei gesteuert). Die Rolle ist solange aktiv, wie die Datenbank-Session, welche die Logon-Komponente geöffnet hat, existiert.

Die Altanwendungen des Kunden haben den Datenzugriff über C++-dlls durchgeführt, die per embedded SQL direkt über die Oracle-Client-dlls auf die Datenbank zugreifen. Die Altanwendugen wurden in der Regel in VB5 oder VB6 geschrieben. Die meisten wurden mittlerweile aber nach .NET portiert, wobei die C++-dlls weiter verwendet wurden (per P/Invoke).

Ich hatte nun die Gelegenheit, eine neue Anwendung zu schreiben, welche über NHibernate (und damit ADO.NET) mit der Datenbank kommuniziert. Als Umgebung verwende ich .NET-Framework 3.5 SP1 und den Oracle-Provider von Microsoft. Zum Login verwendet meine Anwendung ebenfalls die Logon-Komponente des Kunden. Während der Entwicklung sah es so aus, als würde ADO.NET die Datenbanksitzung der Logon-Komponente verwenden. Dies ist jedoch nicht der Fall (da ich nur eingeschränkten Zugang auf die Datenbank habe, konnte ich nicht sehen, dass in der Integrations-Datenbank die Benutzerberechtigungen anders gesetzt waren). Ich musste die Benutzerberechtigungen auf Tabellen-Ebene vergeben, damit sie mit der Anwendung arbeiten können. Diess ist eigentlich ein No-Go für den Kunden.

Auf den Source der Logon-Komponente bzw. die Stored Procedure in der Datenbank habe ich keinen Zugriff (wegen Sicherheitsbedenken des Kunden). Deshalb meine Frage, ob es irgendeine Möglichkeit gibt, ADO.NET bzw. den Connection-Pool zu zwingen, eine Connection die im Kontext von Unmanaged Code erzeugt wurde, zu verwenden.

Danke im Voraus

Klaus
News:
08.10.2011
luedi 2,0k 1 9
3 Antworten
0
Hallo Klaus,

das Problem liegt scheinbar an ADO.NET. Der Unterschied zu den früheren Verbindungsmethoden, die bei VB5/6 usw. verwendet wurden ist, dass ADO.NET Verbindungslos ist. Das bedeutet, dass die Verbindung nur für das Abfragen und Zurückschreiben von Daten zu öffnen ist. Sonst ist sie geschlossen. Die frühere Methoden DAO und ADO waren da anders.

Klassen wie beispielsweise der DbDataAdapter sogen automatisch dafür das die Verbindung geöffnet / geschlossen wird.

Du könntest versuchen das Problem zu lösen indem du im ConnectionString das Pooling der Verbindungen zwar aktiviert aber die Poolgröße auf 1 stellst. Wie das genau geht steht hier: http://msdn.microsoft.com/en-us/library/ms254502.aspx

Gruß

JenneB
08.10.2011
JenneB 206 4
Leider bringt das disablen des Connection Pools überhaupt nichts. Das habe ich aber bereits befürchtet.
luedi 10.10.2011
0
Danke für den Tipp, an den Connection-Pool habe ich noch gar nicht gedacht. Ich werde das nächste Woche gleich ausprobieren.
09.10.2011
luedi 2,0k 1 9
0
Mittlerweile habe ich Zeit gefunden, das Problem etwas genauer mit Hilfe des SQL-Monitors aus TOAD zu analysieren. Die Logon-Komponente generiert ein zufälliges Passwort und weist dieses der Rolle, welche die Tabellenberechtigungen hat, zu. Dann wird dem Benutzer diese Rolle zugewiesen. Danach werden die SQL Statements abgesetzt und alles funktioniert prima.

Der Unterschied in ADO.NET ist im wesentlichen, dass für jedes SQL-Statement vor der Ausführung ein Logon und nach der Ausführung ein Logoff protokolliert wird. Ursprünglich wurde bei jedem Logon ein neues Session Tag angezeigt. Nachdem ich das Connection-Pooling deaktiviert habe, wurde wenigstens immer das gleiche Session Tag angezeigt.

Für mich erhärtet sich meine Vermutung, dass ADO.NET die bestehende Connection ignoriert und eine eigene Connection verwendet. Ich vermute, dass mir nichts anderes übrigbleiben wird, als die Logon-Komponente in .NET nachzuprogrammieren.
10.10.2011
luedi 2,0k 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH