MariaDB Limit über VPN?

DasDaDrüben

Benutzer
Beiträge
8
Hallo,
ich habe eine MariaDB Datenbank im Heimnetz auf einem Synology NAS laufen. Meine Android Studio Kotlin App greift mit der Datei "mariadb-java-client-1.8.0" auf die Datenbank zu. Wenn ich mit dem Smartphone im Wlan unterwegs bin, kann ich SELECT-Anfragen mit der App ohne Begrenzung ausführen. Über die MyFritz App habe ich einen VPN zu meinem Heimnetz eingerichtet. Ich habe zum Test eine Tabelle "T_Test" in der Datenbank "DB_Test" erstellt. Die Tabelle hat ein Feld "ID" und ein Feld "Text", habe in alle Felder den Text: "Test" geschrieben. Wenn ich einen SELECT über das VPN mache und in der Tabelle "T_Test" sind <=99 Einträge dann funktioniert der Befehl. Wenn aber 100 Einträge drinnen sind wird die Abfrage nicht mehr fertig und liefert keinen Wert zurück.

Ich verstehe nicht wie das sein kann. In der Datenbank "mysql" unter der Tabelle "user" hat der User in allen Feldern Y stehen und unter max.. überall 0. Weiß jemand an was das liegen kann? Irrgendwie bekomme ich auch keine SQLException zurück.
 
Werbung:
Ich kann nur vermuten.
Ein Router ist allermeist nicht sehr leistungsfähig. Die Hauptaufgabe ist, Datenströme kontinuierlich weiterzuleiten (und diese zu routen). Mglw. bricht dort irgendein Puffer zusammen.

Um wieviel Datensätzen geht es, wenn es mehr als 100 sind?

Wenn ich Dich richtig verstanden habe, machst Du innerhalb der Smartphone App Select Anfragen? Das wäre in diesem Setting nicht ratsam. Ich kenne Kotlin nicht und weiß nicht, wie die Anbindung / Nutzung / Datenzugriff via Java auf das Dataset erfolgt, aber im Normalfall ist das insgesamt ein Setting für eine Webanwendung oder besser gesagt für einen Application Server. Der würde auf dem NAS laufen (oder auf einem separaten Gerät mit LAN Anbindung zum NAS), der Appserver würde für Paging sorgen und alle zu übertragenden Daten in mundgerechter Form anbieten. Die App fragt dann gezielt kleine Datenmengen ab vom Application Server ab, das was zur Darstellung auf eine Seite passt, bspw. über REST oder andere geeignete Verfahren. Sie spricht also nicht mit dem DB Server. Das hat auch aus anderen Gründen Vorteile, Security z.B.

Grundsätzlich würde man SQL Anfragen unabhängig von Zugriffstechnologie nicht uneingeschränkt öffnen. DB sind darauf ausgelegt Millionen von DS zu halten und notfalls auch zurückzuliefern. Während Storage da heute nahezu keine Limits mehr setzt, ist das bei der Übertragung ganz anders. Abfragen sollten immer, egal auf welcher Ebene, eine gezielte Mengenbeschränkung bewerkstelligen. (Außer bei Backup/Export natürlich)
 
Ich habe die Tabelle immer um einen Datensatz gefüllt und dann geschaut ob die App das über VPN laden kann und ab dem Datensatz 100 ging es nicht mehr (Wenn ein Datensatz mehrere Felder hat denke ich wird es schon vor 100 Datensätzen abbrechen, müsste ich versuchen). Es handelt sich pro Tabelle zwischen 1 und ca. 100000 Datensätze die ich lade. Ich lade immer die ganzen tabelle damit ich damit im Code arbeiten kann und nicht immer wieder abfragen durchführen muss. Im Wlan geht das alles in millisekunden aber beim Tunnel ist irrgendetwas komisch. Die Testabfrage mache ich zurzeit so :

Java:
suspend fun TestLoad_T_Test(): Int {
return try {
var count = 0
DriverManager.getConnection(dbUrl, dbUser, dbPassword).use { connection ->
connection.createStatement().use { statement ->
statement.executeQuery("SELECT * FROM `DB_Test`").use { resultSet ->
while (resultSet.next()) {
count++
}
}
}
}
count
} catch (e: SQLException) {
F_ErrorLog("TestLoad_T_Test | SQLException " + e.message)
e.printStackTrace()
0
}
}

Ob und wieviele Daten ich lade ist ja eigentlich meine Sache, wenn es mir zu langsam wird werde ich dementsprechend spezifische Anfragen senden. Nur das bei 100 results schon schluss ist kann ja nicht sein.
Application Server sagt mir bis jetzt noch nichts, wie kann ich das realisieren mit Synology?
 
Zuletzt bearbeitet:
Wie gesagt, die Hauptfrage ist, ob Du in der Smartphone App die Abfrage an die DB machst oder in einem lokalen App Server.
Der erste Fall ist problematisch.
zwischen 1 und ca. 100000 Datensätze die ich lade
Und der Nutzen ist auch fraglich, was willst Du auf dem Smartphone mit 100T Datensätzen?
 
Es werden Sachen auf Basis von historischen Datensätzen berechnet, dazu brauche ich alle Datensätze der Tabelle und nicht nur einen. Ich dachte es wäre nur Problematisch wenn ich ohne VPN auf die Daten zugreife? Das heißt über VPN auf die Datenbank zuzugreifen ist nicht optimal? Wie setze ich so einen "lokalen App Server" um? Wie ist sowas aufgebaut, gibt es das für synology?
 
Es werden Sachen auf Basis von historischen Datensätzen berechnet, dazu brauche ich alle Datensätze der Tabelle und nicht nur einen. Ich dachte es wäre nur Problematisch wenn ich ohne VPN auf die Daten zugreife? Das heißt über VPN auf die Datenbank zuzugreifen ist nicht optimal? Wie setze ich so einen "lokalen App Server" um? Wie ist sowas aufgebaut, gibt es das für synology?
Natürlich ist es optimal per VPN auf seine Daten zuzugreifen. Da du keine SQLException bekommst scheint das Problem wo anders zu liegen.
Besteht die VPN Verbindung danach noch und was ist wenn du ohne neue getConnection eine 2 Abfrage machst mit wenig Datensätzen ?

Gibt es da noch ein Ergebnis ?
 
Oder schalte mal die Datenkompression ein. Diese verringert die Göße enorm:

Um eine komprimierte Datenübertragung in MySQL in Java zu aktivieren, kannst du die MySQL-JDBC-Verbindung so konfigurieren, dass sie das MySQL Compression Protocol verwendet. Dies kann die Netzwerkübertragung optimieren. Hier ist eine angepasste Version deines Codes, der die komprimierte Datenübertragung aktiviert:


Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

suspend fun TestLoad_T_Test(): Int {
    return try {
        var count = 0
        
        // Erstelle eine Verbindungs-Properties-Instanz und setze die Komprimierungseigenschaft
        val connectionProperties = Properties()
        connectionProperties.setProperty("useCompression", "true")
        
        // Erstelle die Verbindung mit den angegebenen Verbindungs-Properties
        DriverManager.getConnection(dbUrl, connectionProperties).use { connection ->
            connection.createStatement().use { statement ->
                statement.executeQuery("SELECT * FROM `DB_Test`").use { resultSet ->
                    while (resultSet.next()) {
                        count++
                    }
                }
            }
        }
        
        count
    } catch (e: SQLException) {
        F_ErrorLog("TestLoad_T_Test | SQLException " + e.message)
        e.printStackTrace()
        0
    }
}
 
Habe in HeideSQL nachgeschaut wie der Prozess sich verhält, anbei das Bild mit dem Prozess in der ersten Spalte, er bleibt einfach unendlich bestehen. Ich versuche jetzt noch deine funktion.
 

Anhänge

  • 1.png
    1.png
    28,4 KB · Aufrufe: 5
Ob und wieviele Daten ich lade ist ja eigentlich meine Sache, wenn es mir zu langsam wird werde ich dementsprechend spezifische Anfragen senden. Nur das bei 100 results schon schluss ist kann ja nicht sein.
Application Server sagt mir bis jetzt noch nichts, wie kann ich das realisieren mit Synology?
Natürlich ist es Deine Sache, aber es funktioniert schlecht, wie Du hier schreibst. Und das Problem entsteht mit der Nutzung des Routers.
Und wenn es so läuft, wie ich vermute, ist es weit weg von best practice.
Der Router ist in dem ganzen Spiel eine unbekannte Größe. Kann man schlecht debuggen, was da passiert.
Apropos, Du könntest mit Deiner IDE mal von außen über Dein VPN arbeiten und die Laufzeiten loggen, dann vergleichen mit lokalem Betrieb.

Natürlich ist 100 Datensätze keine "gewohnte" Größenordnung. Aber damit schaust Du nur auf einen einzigen Aspekt in Deiner Verarbeitungskette.
Ich hab keine Ahnung, welche Fritzbox Du hast, aber gängige Router können einfach nicht viel. 512 mb RAM, 2 Kerne a 1GHz, 9-10 Watt durchschnittliche Leistungsaufnahme, vielleicht benutzt sie viel davon für WLAN Funk.. dann kommt für VPN Verschlüsselung dazu.
Dass Deine App optimierbar ist, wie BerndB bspw. vorschlägt, ist auch keine Frage, aber sie funktioniert ja "lokal", also ohne Router dazwischen.

Der Protokoll Stack für die Verarbeitung von Datasets ist so oder so nicht gut geeignet für WLAN, geschweige VPN. Viel Overhead pro Record / Fetch, sehr viele Latenzen. Dagegen ist eine Dateiübertragung ein Traum.

Ich denke, dass Du da ein falsches Konzept verfolgst.
Stell Dir vor, Du baust den nicht visuellen Teil deiner Smartphone App als Anwendung für's NAS, dann hast Du grob Deinen App Server.
Deine Smartphone App holt und schickt nur Einzeldaten ("fertige") und rendert sie grafisch hübsch fürs Smartphone. Oder willst Du 100T historisierte Datensätze auf Smartphone aggregieren?
 
Ich denke, dass Du da ein falsches Konzept verfolgst.
Stell Dir vor, Du baust den nicht visuellen Teil deiner Smartphone App als Anwendung für's NAS, dann hast Du grob Deinen App Server.
Deine Smartphone App holt und schickt nur Einzeldaten ("fertige") und rendert sie grafisch hübsch fürs Smartphone. Oder willst Du 100T historisierte Datensätze auf Smartphone aggregieren?
Ich glaube auch das das Konzept nicht stimmig ist und einer Überarbeitung bedarf, jedoch sollte das ganze auch über vpn funktionieren, egal wie schnell
 
Kannst ja die DB mal zur Probe auf deinem PC installieren und die VPN-Verbindung dahin machen um zu sehen wie sich das ganze dann verhält
 
Ich habe schon ca. 150 Tabelle die ich alle schon so verarbeite. Von Access am PC bin ich zu C# + MariaDB. Die Funktionen lass ich mir alle mit GPT übersetzen. Mobil mache ich das jetzt mit Android Studio und Kotlin. Zumindest hab ich schon überhaupt mal eine Verbindung zustande bekommen, hat jetzt schon sehr lange gedauert überhaupt erst an diesen Punkt zu kommen😅. Also zurzeit mache ich die Verbindung einfach nur mit einem VPN-Button in der myfritz App siehe Bild. Wie könnte ich die Verbindung den sonst machen, direkt im Kotlin Code hab ichs bis jetzt noch nicht geschafft und mein Router unterstütz kein wireguard irgendwie. Eine direkte verbindung mit dem VPN Fenster von Android hab ich auch noch nicht zustande bekommen. :rolleyes:
 

Anhänge

  • 1.jpg
    1.jpg
    63,8 KB · Aufrufe: 2
Werbung:
Kannst ja die DB mal zur Probe auf deinem PC installieren und die VPN-Verbindung dahin machen um zu sehen wie sich das ganze dann verhält
Habe das mal gemacht und die Abfrage von 2000 Datensätzen dieser Art hat 3 Sekunden gedauert mit Rückgabewert. Bei 5000 Datensätzen wird der Prozess entfernt aber kein Rückgabewert und keine SQLexception 🫣
 
Zurück
Oben