German mysql-DB syncron abfragen

SirHarry

Member
Licensed User
Longtime User
Vielleicht hat bei dieser Frage auch jemand eine Idee

Idealerweise suche ich eine Möglichkeit, eine MySQL-DB nicht asyncron, sondern syncron abzufragen.
Ich stelle mir dafür eine Klasse vor, welches folgende Möglichkeit zur Verfügung stellt.
a= db.select("select from .....")
Das würde einiges erleichtern.

Mein Gedanke dazu;
Eine Klasse erstellen, welche nach Beenden des Selects in einer Schleife wartet, bis die Antwort kommt und erst dann die Antwort an das wartende Programm zurückgibt. Die entstehende Verzögerung im Programm wäre mir grade bei größeren Apps lieber als dass die Antwort irgendwann beliebig ankommt.
Ich habe das natürlich bereits probiert, habe aber erkennen müssen, dass in Klassen HTTP-Jobs wohl abgesendet werden können, aber keine Antwort annehmen können. Jobdone funktioniert also nicht. Ist das so?
 

Alexander Stolte

Expert
Licensed User
Longtime User
Das klingt nach einen Fall für jRDC das findest du hier und hier habe ich ein kleines Deutsches Tutorial geschrieben zur Implementierung anhand eines MSSQL Servers, aber für MySQL ist es gleich, nur brauchst du einen anderen Treiber, ist aber dort beschrieben.
 

SirHarry

Member
Licensed User
Longtime User
Super! Danke für den Tip.

Ich hatte mir diese Möglichkeit bereits angesehen, bin aber an der engl. Beschreibung gescheitert.
Werde es mir deine Beschreibung gleich mal ansehen.

Wenn ich die engl.Beschreibung von Erel richtig verstanden habe, muß man da ein java-Proggi auf dem Server ablegen und ansprechen.
Das wird ja dann bei einem Provider wie z.B. 1und1 sicher nicht funktionieren. Oder hab ich das falsch verstanden
Egal, ich schau mir deine Beschreibung an. Wahrscheinlich klärt das einiges auf.
 

SirHarry

Member
Licensed User
Longtime User
hmm..:confused:
Etwas verwirrt mich.
Du schreibst in deiner Beschreibung oben von der Installation der Treiber in B4J
Sieht also zunächst so aus, als könnte man jDBC , so wie bei dir beschrieben nur in B4J verwenden?
Weiter unten schreibst du dann von einer Verwendung mit Android.

Ich benutze einen Linux-Server. Das würde heissen, dass ich sowohl den Treiber, als auch B4J auf diesem Server installieren müsste.
Den Treiber bekomme ich sicher hin. Aber B4J?
Damit schießt sich auch die Möglichkeit aus, für den späteren Produktivlauf auf gehosteten Speicherplatz zu gehen.
Schade also.

Trotzdem denke ich, dass diese Lösung zumindest auf meinem lokalen Linux-Server zum laufen gebracht werden kann.
Ich habe den zum Testen ja auch im Internet hängen.
Ich muß mich also wohl oder übel doch nochmal mit der Beschreibung von Erel beschäftigen.

Trotzdem Danke nochmal für den Tip.
ich werde mich auf jeden Fall damit beschäftigen:)
 

Alexander Stolte

Expert
Licensed User
Longtime User
Wir schreiben mit B4J den Server der dann später auf deinem Linux-Server läuft. Da dieser Server dann ein Java Programm ist, läuft dieser auch auf Linux. Da meine Virtuellen Server alle mit Windows Server laufen, habe ich dort auch B4J installiert, das geht schneller wenn ich in den Log schauen will (mit B4J bekomme ich diese in echt Zeit und muss nichts neu laden), oder mal schnell das ServerProgramm neu-kompilieren muss. Aber es reicht wenn du B4J auf deinem PC installiert hast und dann später das Kompilierte Java Programm auf deinen Linux-Server verschiebst und ausführst. mit b4j musst du nur 2,3 Dinge ändern am code wie in den Tutorials, den Rest machst du dann in der config.properties Datei, wenn du dort was änderst muss du mit b4j halt Neukompilieren und das kompilierte auf deinen Server verschieben und ausführen.

den JDBC driver brauchst du nicht auf deinem Server, nach meiner Erfahrung, der Treiber ist ein Java-Treiber der eine typische Java exe ist, was du in deinen Additionalen Ordner packst für Bibliotheken, für B4J.

Es ist in der Theorie einfach, dennoch braucht es seine Zeit bis man Routine hat, kannst auch versuchen B4J auf Linux zum laufen zu bekommen, denn das ist sehr bequem wenn man gleich auf dem Test-Server den Server Kompilieren kann und man dann die Logs in echt-zeit bekommt.

Hier ist noch ein Tutorial wie man B4J unter Linux zum laufen bekommt. Hab aber keine Erfahrung damit, weil ich nur mit Windows arbeite.
 

DonManfred

Expert
Licensed User
Longtime User
Das wird ja dann bei einem Provider wie z.B. 1und1 sicher nicht funktionieren. Oder hab ich das falsch verstanden
vermutlich geht das da nicht wenn du keinen eigenen server hast.
ABER jRDC ist DEFINITIV ASYNC.
ass ich sowohl den Treiber, als auch B4J auf diesem Server installieren müsste
Du musst Java 8 installieren, ja.
Damit hast Du dann auch schon die Grundlage für java applikationen geschaffen.
B4J apps sind nichts anderes als java apps. Die musst du nicht installieren. Die muss nur an den richtigen Ort kopiert werden um sie starten zu können.
 
Last edited:

SirHarry

Member
Licensed User
Longtime User
ABER jRDC ist DEFINITIV ASYNC.
Da hast Du allerdings recht. Habe ich inzwischen auch fest gestellt.
Im Prinzip wird da wohl nur der sonst übliche PHP-Service diurch einen Java-Service erstetzt.
Für meine Zwecke also im Moment unbrauchbar.

Aber im Grunde ist das doch hinfällig mit der aktuellen B4A Version und wait for... Du kannst Asynchrone Methoden problemlos Synchron benutzen aber die Anfragen an sich bleiben ASync (Stichwort Resumable Subs).
Damit habe ich versucht, mir eine Datenbank-Zugriffsklasse zu bauen. Hat nicht geklappt.
Kann es sein, dass Klassen keine Jobdone-Events abfangen können?
Ich vermute mal, weil sie im Programm als Objekt mit anderem Namen aufgerufen werden und dann der Verweis Me in : myJOB.Initialize(action, Me) nicht mehr stimmt?
 

DonManfred

Expert
Licensed User
Longtime User
Kann es sein, dass Klassen keine Jobdone-Events abfangen können?
Doch, können sie. Activity, Service und Klassen haben einen Context.
und dann der Verweis Me in : myJOB.Initialize(action, Me) nicht mehr stimmt?
Der code ist in einer activity wo die Klasse initialisiert wird (verwendet wird). Das Me ist der zeiger auf die aktuelle activity.
act main benutzt die Klasse. eine instanz der Klasse wird generiert mit rereferent auf main.
Act somewhat wird aufgerufen und benutzt ebenfalls diese Klasse. Es wird eine neue Instanz der Klasse generiert. Diesmal mit referenz auf activity somewhat.

Wenn eine Klasse in mehereren Activities verwendet wird dann ist es oft ratsam die Klasse aus dem Starter service heraus zu initialisieren.
 

SirHarry

Member
Licensed User
Longtime User
OK! Danke für die ausführliche Erklärung.:)
Das heisst aber, wenn dich richtig verstehe, daß die Antwort des Jobs nicht in die Instanz meiner Klasse zurück kommt, sondern in die Activity, welche die Klasse initialisiert hat. Obwohl ich den Job in der Klasse initialisiert habe.
Weil ich Me verwendet habe. Richtig?
Ich möchte aber die Antwort innerhalb der Klasse abfangen und verarbeiten.
Kann ich dann beim Aufrufen des Jobs anstatt Me den Namen der Klasse (oder der Instanz verwenden)?:confused:
 

SirHarry

Member
Licensed User
Longtime User
OK! Danke für die ausführliche Erklärung.:)
Das heisst aber, wenn dich richtig verstehe, daß die Antwort des Jobs nicht in die Instanz meiner Klasse zurück kommt, sondern in die Activity, welche die Klasse initialisiert hat. Obwohl ich den Job in der Klasse initialisiert habe.
Weil ich Me verwendet habe. Richtig?
Ich möchte aber die Antwort innerhalb der Klasse abfangen und verarbeiten.
Kann ich dann beim Aufrufen des Jobs anstatt Me den Namen der Klasse (oder der Instanz verwenden)?:confused:
 

DonManfred

Expert
Licensed User
Longtime User
daß die Antwort des Jobs nicht in die Instanz meiner Klasse zurück kommt, sondern in die Activity, welche die Klasse initialisiert ha
nein.

act A macht instanz der Klasse C auf. C bekommt in der initialisierung als "empfänger" act A mit
C macht einen httpaufruf, das Ergebnis landet auch in C. C muss dann das ergebnis an den Empfänger weiterleiten. -> Act A

Act B macht eine Instanz der Klasse C auf (empfänger Act B), c macht http. Result kommt in C an. C sendet ergebnis an Act B
 
Top