German mysql-DB syncron abfragen

Discussion in 'German Forum' started by SirHarry, Aug 13, 2017.

  1. SirHarry

    SirHarry Member Licensed 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?
     
  2. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed 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.
     
  3. SirHarry

    SirHarry Member Licensed 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.
     
  4. SirHarry

    SirHarry Member Licensed 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:)
     
  5. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    12 Uhr kann ich dir ausführlich Antworten, mein Ausbilder sitzt mir im Nacken.
     
  6. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed 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.
     
  7. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    Bei Fragen stehe ich gerne zur Verfügung.
     
  8. DonManfred

    DonManfred Expert Licensed User

    vermutlich geht das da nicht wenn du keinen eigenen server hast.
    ABER jRDC ist DEFINITIV ASYNC.
    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: Aug 14, 2017
  9. DonManfred

    DonManfred Expert Licensed User

    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).
     
    KMatle likes this.
  10. SirHarry

    SirHarry Member Licensed User

    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.

    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?
     
  11. mw71

    mw71 Active Member Licensed User

  12. DonManfred

    DonManfred Expert Licensed User

    Doch, können sie. Activity, Service und Klassen haben einen Context.
    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.
     
  13. SirHarry

    SirHarry Member Licensed 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:
     
  14. SirHarry

    SirHarry Member Licensed 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:
     
  15. DonManfred

    DonManfred Expert Licensed User

    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
     
  16. SirHarry

    SirHarry Member Licensed User

    OK. Ich werde das mal in einem Test durchspielen.
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice