Autor Beitrag
chewie
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 02.07.02 12:25 
Hallo zusammen,

Ich sollte auf dieselben Tabellen einer Desktop-Datenbank (Paradox) aus zwei verschiedenen Applikationen zugreifen können. Es gibt für beide Applikationen je eine eigene Datenbank. Die eine Applikation sollte aber auch auf die Datenbank der anderen Applikation zugreifen können.

Ein erster Ansatz war, pro Applikation eine eigene Session über Sessions.OpenSession(<String>) zu laden, das ging soweit gut.

Das Problem ist jetzt, dass unter gewissen Bedingungen die eine Applikation nicht mehr beendet wird (Task bleibt hängen).

-----------------------------
Situation, die nicht klappt:

Starten 1. Applikation (app1)
app1 greift auf ihre Datenbank (db1) zu (mit Session1)

Starten 2. Applikation (app2)
app2 greift auf ihre Datenbank (db2) zu (mit Session2)

app2 greift auf db1 zu (mit Session3)

app2 beenden (im Debugger sieht man einen Absturz, ohne Debugger sieht man nichts

app1 beenden -> Task bleibt hängen
-----------------------------

Kennt sich da jemand aus?

Gruss - Jörg
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Di 02.07.02 17:16 
>zwei verschiedenen Applikationen zugreifen können.
Meinst du damit mehrere Anwendungen im Netz?

Auch wenn mir dein System ein bischen unlogisch erscheint, es sollte aber gehen.

Brauchst du die Db nur zum lesen?
Dann könntest du dir auch einfach eine lokale Kopie erstellen.

_________________
Keine Signatur ...
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 02.07.02 20:59 
Hoi Steffer,

Beide Anwendungen befinden sich auf demselbem Computer; alles ist lokal.

Meine Beschreibung ist wahrscheinlich etwas zu ungenau, so dass es unlogisch erscheint. Für mich ist die Sache ziemlich komplex, ich weiss nicht, wie ich es beschreiben soll, dass es klar wird - es würde wahrscheinlich recht lang.

In einem ersten Schritt reicht lesen, allerdings soll bald auch Schreibzugriff möglich sein. Deshalb möchte ich, wenn es geht, nicht eine Spezial-Lösung für das Lesen machen, die ich wieder umbauen muss, sobald das Schreiben implementiert wird.

Es ist so, dass der Ansatz bisher war, dass jede Applikation genau auf ihre Datenbank zugreifen kann (jedes Programm kennt genau seine Daten). Wegen neuer Anforderungen muss jetzt aber auch der Zugriff auf andere Datenbanken möglich sein. Deshalb versuche ich die Zugriffs-Logik so zu kapseln, dass es nicht mehr wichtig ist, welche Applikation auf welche Datenbank zugreift.

Ich habe jetzt also mehrere Prozesse, welche lokal auf dieselbe Paradox-Datenbank zugreifen sollen, und da klemmts, wenn ich genau die oben beschriebene Reihenfolge einhalte.

Gruss und mal Danke für den Hinweis

Jörg
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Mi 03.07.02 11:39 
Hy,
mir säusselt da so was. Das Problem hatte schon mal jemand.

Da lag es aber, wenn ich mich richtig erinnere, an einer schrägen BDE Einstellung.

Prüfe mal das NET-Dir und verändere mal LocalShare

_________________
Keine Signatur ...
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 04.07.02 08:59 
Hoi Steffer,

Danke für den Tipp.

Auf Anhieb hat das leider nichts gebracht. Sprichst du von einer Einstellung, welcher der andere jemand vorher hatte, wenn du von dieser "schrägen Einstellung" sprichst? Oder war die Einstellung nachher schräg?

Ich arbeite praktisch überall mit den Standard-Einstellungen der BDE.

Das einzige, was ich ändere, ist das NetFileDir und das PrivateDir (über die Session) - dies jeweils zur Laufzeit der Programme.

Gruss - Jörg
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 04.07.02 10:44 
Hmm, möglicherweise habe ich das Wichtigste vergessen zu erwähnen :oops:.

Ich habe soeben gemerkt, dass das Problem wahrscheinlich in der DLL liegt, welche auf die DB zugreift ('app2' aus meinem 1. Beitrag greift auf 'db1' mit Session 3 über eine DLL zu).

Gibt es vielleicht etwas Spezielles, was ich beachten muss, wenn ich den ganzen Zugriff in eine DLL verlagert habe? Kann ich explizit eine DB-Verbindung schliessen?

Gruss - Jörg
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Do 04.07.02 11:47 
Kennst du die mit der Unit BDE ein bischen aus?

Da gibt es imho eine Möglichkeit Sitzungen zu listen und zu killen.

_________________
Keine Signatur ...
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 05.07.02 20:16 
Hoi Steffer,

Die BDE-Unit kenne ich nicht speziell gut. Ich habe allerdings in der Delphi-Hilfe einen Eintrag gefunden, welcher eigentlich genau das machen sollte, was ich möchte: Session.Active muss auf false gesetzt werden, dann sollten alle bestehenden Verbindungen gekappt werden.

Genützt hat dies allerdings leider nichts.

Gruss - Jörg
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Fr 05.07.02 21:38 
Session.Active wirkt sich nur auf die aktuelle Session der Application aus, nicht auf alle.

Lass uns nochmals von vorne anfangen! Ok?
Schreib mal eine ganz einfache Demo:
1 DB, 2 Applikationen + Zugriff und schau dann mal.
Sollte das ganze gehen, übertrage es auf deine eigentliche Application.
Sollte es nicht gehen, packe es zusammen und schicke es mir an steffer@faqsen.de.

Ich schaue es mir dann hier mal an und teste es auf unserem System.

_________________
Keine Signatur ...
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 05.07.02 22:30 
Hoi Steffer,

Dein Vorschlag mit der Demo ist super! Ich habe mich so verstrickt, dass ich vor lauter Bäumen den Wald nicht mehr sehen kann. Das Ausweichen auf eine einfache Demo könnte da Wunder wirken.

Herzlichen Dank für dein Angebot! Da möchte ich eventuell später darauf zurückkommen. Ich würde gerne selbst noch etwas herumprobieren.

Nochmals vielen Dank!

Gruss - Jörg
chewie Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 15.07.02 14:12 
Hoi Steffer,

Unterdessen hat es doch noch geklappt.

Das Problem lag im Zeitpunkt der Freigabe desjenigen Objekts, welches den Zugriff auf die Datenbank machte. Ich wollte dem Benutzer der DLL ersparen, dass er eine Instanz anlegen und auch wieder freigeben muss, und habe das Freigeben im 'finalization'-Teil der Unit, wo die entsprechende Klasse ausprogrammiert war, gemacht (ich versuchte einen "Singleton" zu implementieren nach dem Design-Pattern Buch der "Gang of Four").

Irgendwie kam der 'finalization'-Teil offenbar jeweils nicht zum richtigen Zeitpunkt zur Ausführung, deshalb gab es Abstürze.

Das tönt möglicherweise etwas konfus, aber es funktioniert jetzt wenigstens.

Nochmals vielen Dank für die Hilfe!

Gruss - Jörg