SWT Globale Variable

breakpoint

Mitglied
Hi,
wie würdet ihrer in einer SWT-Anwendung (kein Eclipse RCP) ein Database-Handle global verfügbar machen?

Gibt's was eleganteres als ein Singelton? Wobei dies alle Anforderungen erfüllen würde.

Danke für Tipps/Beispiele! :]
 
Zuletzt bearbeitet:

breakpoint

Mitglied
Es ist eine JDBC-Connection. Bei Programmstart wird die Verbindung hergestellt und gehalten. Jedes SWT-Fenster soll prinzipiell auf sie Zugriff haben.
 

Joose

Top Contributor
Eine Datenbankverbindung sollte dann bestehen wenn sie gebraucht wird. Eine dauerhaft geöffnete Verbindung sollte vermieden werden.
 

da921610

Aktives Mitglied
Meinst du vielleicht sowas wie eine abstrakte Klasse, wo alle Methoden statisch sind?
Und innerhalb dieser Methoden kannst du ja dann immer die Verbindung aufbauen. Bzw. dir statische Variablen speichern.
Somit würdest du von jeder Klasse darauf zugreifen können, ohne dir ein Objekt zu erzeugen.
 

breakpoint

Mitglied
Danke für eure Antworten.

@user da921610: Da wäre ich wieder bei meinem Singelton :)
@Joose:
Es ist eine sqlite-Datenbank, auf die zugegriffen wird, und die Verbindung wird die gesamte Programmlaufzeit über benötigt.
 

Joose

Top Contributor
Je nach deiner Architektur kannst du das DB Handle an einer zentralen Stelle erstellen und per getter/setter an die benötigten Komponenten weiterreichen. Bei einer entsprechenden Trennung der Zuständigkeiten sollten nur wenige Klassen wirklich den DB Handle benötigen.

Da wäre ich wieder bei meinem Singelton :)
Singleton wäre eine schlechte Wahl.

Es ist eine sqlite-Datenbank, auf die zugegriffen wird, und die Verbindung wird die gesamte Programmlaufzeit über benötigt.
Ich bin mir da unsicher ;)
Wird wirklich eine dauerhafte Verbindung gebraucht? Sprich gibt es einen Thread der alle paar ms Daten schreibt, liest oder analysiert?
Oder werden erst Daten gelesen/eingetragen sobald der User bestimmte Aktionen/Events auslöst?
 

breakpoint

Mitglied
@Joose, es kann natürlich vorkommen, dass der User mal kurz nen Kaffee holen geht ;). Aber grundsätzlich wird die Verbindung die ganze Zeit benötigt. Ich denke, ein Reconnect wäre da unnötig. Ich würde deinem Einwand zustimmen, wenn es Grund gäbe, die dahinterliegende Datenbank durch einen Disconnect zu schonen. Doch es ist, wie gesagt, nur diese eine sqlite-Datei, die ausschließlich von 1 Programm genutzt wird.

Aber zurück zur eigentlichen Frage: Beim Singelton ist mir nicht ganz wohl, ja. Was wäre eine gute Alternative?
 

dzim

Top Contributor
@Joose Was findest du denn so schlimm am Singleton? Es gibt Situationen, da lässt es sich kaum vermeiden.

In dem Beispiel hier würde ich ungefähr so etwas machen:
Java:
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Locale;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.sqlite.SQLiteConfig;
import org.sqlite.javax.SQLiteConnectionPoolDataSource;

/* etwas gekürzt */

public class ConnectionManager {
   
    private static final Logger LOGGER = LogManager.getLogger(ConnectionManager.class.getName());
   
    private static SQLiteConnectionPoolDataSource dataSource = null;
   
    public static void init() throws DesktopDAOException {
        init(null);
    }
   
    public static void init(Properties props) throws Exception {
       
        if (props != null) {
            // check props and: append to JDBC, or drop / update tables / ...
        }
       
        String userHome = System.getProperty("user.home");
        if (userHome == null || userHome.isEmpty()) {
            // hier sollten "Custom" Exceptions verwendet werden - nicht Exception - wurde hier gekürzt
            throw new Exception("Could not determine the current user's home!");
        }
       
        SQLiteConfig config = new SQLiteConfig();
        dataSource = new SQLiteConnectionPoolDataSource(config);
       
        File dbPath = new File(userHome + Constants.USER_PATH);
        if (!dbPath.isDirectory()) {
            dbPath.mkdirs();
        }
       
        String url = String.format(Locale.ENGLISH, Constants.CONN_STRING_TEMPLATE, userHome);
        LOGGER.debug(String.format(Locale.ENGLISH, "JDBC-URL is: %s", url));
       
        dataSource.setUrl(url);
        dataSource.setDatabaseName(Constants.DB_NAME);
       
        try {
            initPerformanceDB();
        } catch (SQLException e) {
            throw new Exception(e);
        }
    }
   
    public static DataSource getDataSource() throws DesktopDAOException {
        if (dataSource == null)
            init();
        return dataSource;
    }
   
    public static Connection getConnection() throws DesktopDAOException, SQLException {
        if (dataSource == null)
            init();
        return dataSource.getConnection();
    }
   
    private static void initPerformanceDB() throws DesktopDAOException, SQLException {
        try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) {
            stmt.executeUpdate(Tables.Preferences.SQL_CREATE);
            stmt.executeUpdate(Tables.Results.SQL_CREATE);
            stmt.executeUpdate(Tables.ResultDetails.SQL_CREATE);
        }
    }
}

Sprich: Da ist ein Singleton für die DataSource. Die connection selbst ist "on-demand" und sollte auch, wie @Joose es beschreibt nicht permanent offen gehalten werden.
 

Joose

Top Contributor
Was findest du denn so schlimm am Singleton? Es gibt Situationen, da lässt es sich kaum vermeiden.

Natürlich gibt es ganz seltene Ausnahmen wo ein Singleton hilfreich sein kann, aber das ist eben selten. Es sollte sich jederzeit anders lösen lassen.
Wenn ich dieselbe Instanz von etwas an den unterschiedlichsten Stellen brauchen dann muss ich diese eben entsprechend weiterreichen.
 

dzim

Top Contributor
Das nennt sich DependecyInjection - und am Beispiel von SpringBoot, mit dem ich so was auch schon mal für JavaFX gemacht. Und am Ende waren die DAOs auch als Singletons gescoped - weil in dem Fall alles andere sinnlos ist.
Singleton sind IMHO per se nicht "böse" und die Art der Dependency Injection ist am Ende meist auch nur syntaktischer Zucker.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
kb frame als globale variable AWT, Swing, JavaFX & SWT 2
Y Globale Font-Color definieren AWT, Swing, JavaFX & SWT 5
C Swing globale "Key Bindings" für Swing-Applikation AWT, Swing, JavaFX & SWT 6
J SWT Globale Refresh-Aktion programmtechnisch aufrufen AWT, Swing, JavaFX & SWT 6
M Globale Events in Windows abfangen AWT, Swing, JavaFX & SWT 2
I Globale Tastatur-Events abfragen AWT, Swing, JavaFX & SWT 3
O No X11 DISPLAY Variable was set AWT, Swing, JavaFX & SWT 6
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
S Swing jx cannot be resolved to a variable (2.) AWT, Swing, JavaFX & SWT 1
S Swing jx cannot be resolved to a variable AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
K Wie kann ich eine Variable zwischen Tab Klassen weitergeben ? AWT, Swing, JavaFX & SWT 7
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
Z Wird die Variable nicht übergeben ? AWT, Swing, JavaFX & SWT 16
L Swing Variable Anzahl an JButtons AWT, Swing, JavaFX & SWT 7
L ActionPerformed Variable übergeben AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
J JavaFX Variable an neue Scene übergeben AWT, Swing, JavaFX & SWT 8
V Warum wird meine Variable nicht erkannt? AWT, Swing, JavaFX & SWT 2
M Swing Alter Wert von einer Variable wird verwendet AWT, Swing, JavaFX & SWT 8
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
J Swing String soll als Variable dienen AWT, Swing, JavaFX & SWT 11
B Variable ist leer / Scope von Variablen AWT, Swing, JavaFX & SWT 2
J Button En-/Disablen - Warum variable final? AWT, Swing, JavaFX & SWT 2
M private Variable übergeben AWT, Swing, JavaFX & SWT 12
U AWT local variable * is accessed from within inner class; needs to be declared final AWT, Swing, JavaFX & SWT 6
R Swing Variable Panelbreite ohne Layoutmanager AWT, Swing, JavaFX & SWT 6
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
H Swing variable in Numberfield ausgeben AWT, Swing, JavaFX & SWT 5
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
B Anprechen von TextAreas mit Variable AWT, Swing, JavaFX & SWT 2
N Listener für Variable AWT, Swing, JavaFX & SWT 4
B Button benennen via Variable? AWT, Swing, JavaFX & SWT 6
B Variable wird nicht gefunden AWT, Swing, JavaFX & SWT 5
C Button/Textfeld mit Variable verknüpfen AWT, Swing, JavaFX & SWT 4
B Swing Variable in JTextfield geht nicht AWT, Swing, JavaFX & SWT 10
B problem mit variable (final) AWT, Swing, JavaFX & SWT 7
P Zeichen abhängig davon, ob sich eine Variable geändert hat AWT, Swing, JavaFX & SWT 2
T statische Variable zum Referenzieren einer Instanz von Frame AWT, Swing, JavaFX & SWT 3
J Integer aus Textdatei auslesen und in Variable speichern AWT, Swing, JavaFX & SWT 11
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
J -variable Formular Klasse AWT, Swing, JavaFX & SWT 2
E Variable übergeben AWT, Swing, JavaFX & SWT 4
B Cannot refer to a non-final variable (JButton) AWT, Swing, JavaFX & SWT 3
G JTable - Zeilenhöhe variable? AWT, Swing, JavaFX & SWT 2
D Auf Variable zugreifen AWT, Swing, JavaFX & SWT 3
G variable übergeben in andere klasse AWT, Swing, JavaFX & SWT 4
S Bild in einer Variable speichern AWT, Swing, JavaFX & SWT 7
S Eingabe des Textfeldes in Variable speichern AWT, Swing, JavaFX & SWT 7
R JFrame -- Variable Positionierung durch Window Manager? AWT, Swing, JavaFX & SWT 2
M variable Jtable AWT, Swing, JavaFX & SWT 4
P GetSelectetItem() erkennt Variable aus Liste nicht. AWT, Swing, JavaFX & SWT 2
K Polygon in image variable? AWT, Swing, JavaFX & SWT 2
T Variable Zeilenhöhe in jTable AWT, Swing, JavaFX & SWT 5
P JTable variable Zeilengröße AWT, Swing, JavaFX & SWT 3
O Display Env. Variable unter (X11) von ClientApp. abfragen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben