DB Zugriff mit JProgressBar

ElJarno

Mitglied
Hi Leute,
in meinem jetztigen Programm geht es darum, dass ich größere Datenmengen in eine DB speichere. Um den Benutzer zu informieren wie weit die Abarbeitung ist, wollte ich ein JProgressBar implementieren. Aufgrund des bekannten Problems mit der Sichtbarkeit und der Threads wollte ich nun irgendwie die Schleifenabarbeitung in ein Thread-Objekt auslagern Hier mal der ürsprüngliche Code:

Code:
    public void insertBinaerDaten(String dateiID, int packetGroesse, File datei)
            throws SQLException, IOException {
        BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(datei));
        long dateiGroesse = datei.length();
        int partNr = 0;
        if (dateiGroesse <= Integer.MAX_VALUE) {
            int bytesLeft = (int) dateiGroesse;
            this.edStatusBar.getProgressBar2().setMinimum(0);
            this.edStatusBar.getProgressBar2().setMaximum(bytesLeft);
            
            
            while (bytesLeft > 0) {
                String objid = ObjectID.getOBJID(199);
 
                java.sql.PreparedStatement ps = this.getConnection().prepareStatement(
                        "INSERT into " + paketDatenTabelle + " VALUES(?,?,?,?,?)");
                ps.setString(1, objid);
                ps.setString(2, dateiID);
                ps.setInt(3, partNr);
                ps.setInt(4, packetGroesse);
                ps.setBinaryStream(5, inputStream, packetGroesse);
                ps.execute();
                ps.close();
                partNr += 1;
                bytesLeft -= packetGroesse;
                this.edStatusBar.getProgressBar2().setValue(
                        this.edStatusBar.getProgressBar2().getMaximum() - bytesLeft);
            }
            inputStream.close();
        } else {
            this.edStatusBar.getProgressBar2().setValue(0);
            throw new IOException("Datei ist zu groß! " + datei.getName());
        }
    }

Und hier der Versuch die Schleife in den Thread auszulagern.

Code:
    public void insertBinaerDaten(String dateiID, int packetGroesse, File datei)
            throws SQLException, IOException {
        BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(datei));
        long dateiGroesse = datei.length();
        int partNr = 0;
        if (dateiGroesse <= Integer.MAX_VALUE) {
            int bytesLeft = (int) dateiGroesse;
            this.edStatusBar.getProgressBar2().setMinimum(0);
            this.edStatusBar.getProgressBar2().setMaximum(bytesLeft);
 
            new Thread(new Runnable() {
                public void run() {
                    while (bytesLeft > 0) {
                        String objid = ObjectID.getOBJID(199);
 
                        java.sql.PreparedStatement ps = getConnection().prepareStatement(
                                "INSERT into " + paketDatenTabelle + " VALUES(?,?,?,?,?)");
                        ps.setString(1, objid);
                        ps.setString(2, dateiID);
                        ps.setInt(3, partNr);
                        ps.setInt(4, packetGroesse);
                        ps.setBinaryStream(5, inputStream, packetGroesse);
                        ps.execute();
                        ps.close();
                        partNr += 1;
                        bytesLeft -= packetGroesse;
 
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                edStatusBar.getProgressBar2().setValue(
                                        edStatusBar.getProgressBar2().getMaximum() - bytesLeft);
                            }
                        });
 
                    }
                    inputStream.close();
                }
            }).start();
        } else {
            this.edStatusBar.getProgressBar2().setValue(0);
            throw new IOException("Datei ist zu groß! " + datei.getName());
        }
    }

Problem hierbei ist nun die Sichtbarkeit der lokalen Variablen in der Methode die ja in dem Thread-Objekt nicht Sichtbar sind, wollte jetzt nicht unbedingt alle lokalen Variablen global zwischenspeichern. Was noch viel problematischer dabei ist, dass man die Exceptions nicht weiterreichen kann. Und da weiß ich wriklich nicht wie ich das Problem lösen soll.
Ein kongrete Code-Hilfe würde mir echt weiter helfen da ich mich mit Threads noch nicht wirklich befasst habe.

Gruß Jan:)
 
Zuletzt bearbeitet:
Zurück