Schnellste Methode Datei aus Datenbank herstellen

skizZ

Aktives Mitglied
Hallo zusammen,

ich bin gerade dabei Dateien in eine PostgreSQL Datenbank zu speichern und danach wieder auszulesen und als Datei herzustellen.

Als Feldtyp habe ich in der Datenbank "bytea" genommen und füge die Dateien per JDBC folgendermaßen in die Datenbank ein:

Java:
FileInputStream fis = new FileInputStream(allFiles[i]);
PreparedStatement ps = c.prepareStatement("INSERT INTO files (name, file) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS);
ps.setString(1, allFiles[i].getName());
ps.setBinaryStream(2, fis, (int)allFiles[i].length());
ps.executeUpdate();

Somit habe ich die Datei im Binärformat in der Datenbank vorliegen.
Was ist nun die schnellste Methode die Datei wieder auf der Festplatte herzustellen?

Im Moment mache ich es so:

Java:
File f = new File("c:/test/" + rs.getString(2));
                        try {
                            f.createNewFile();
                        } catch (IOException ex) {
                            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        int read = 0;
                        OutputStream out = null;
                        try {
                            out = new FileOutputStream(f);
                        } catch (FileNotFoundException ex) {
                            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        InputStream is = rs.getBinaryStream(3); // to download
                        BufferedInputStream input = new BufferedInputStream(is);
                        while ((read = input.read()) != -1) {
                            out.write(read);
                        }
                        out.flush();
                        out.close();

Dies dauert bei 700 Dateien mit jeweils ca 20kb ca. eine Minute.
Hat jemand eine schnellere Lösung parat?


Viele Grüße
skizZ
 

madboy

Top Contributor
Java:
                        InputStream is = rs.getBinaryStream(3); // to download
                        BufferedInputStream input = new BufferedInputStream(is);
                        while ((read = input.read()) != -1) {
                            out.write(read);
                        }
                        out.flush();
                        out.close();
Du liest jedes Byte einzeln und schreibst es auch einzeln. Verwende ein Array für's lesen und Schreiben:
Java:
byte[] data = new byte[1024];
while (input.read(data) != -1) {
   out.write(data);
Das wird so nicht ganz funktionieren, da auch am Ende noch das komplette Array geschrieben wird, obwohl nur halb voll, also noch anpassen vor Verwendung.
 

skizZ

Aktives Mitglied
Hallo,

genau sowas wollte ich vermeiden, da die Dateien im Endeffekt eine unbekannte Größe haben, also evtl muss das byte[] größer als 1024 sein... Wie vermeide ich, dass das komplette Array geschrieben wird? Solange schreiben bis byte[n] = null oder empty?
 
S

SlaterB

Gast
das steht doch überall, einfach nur ein einziges Beispiel anschauen bevor du das selber programmierst,
so schwer?

FileOutputStream : FileOutputStreamFileJava Tutorial

Java:
      byte[] readData = new byte[1024];
      FileInputStream fis = new FileInputStream(originFile);
      FileOutputStream fos = new FileOutputStream(destinationFile);
      int i = fis.read(readData);

      while (i != -1) {
        fos.write(readData, 0, i); // hier wird gegebenenfalls nur ein Teil des Arrays geschrieben
        i = fis.read(readData);
      }

--------

extremer Tuning-Tipp:
byte[] > 20k

und evtl. zwei verschiedene Threads, einer liest aus der DB, ein anderer schreibt,
so werden die Pausen, in denen die DB für sich beschäftigt ist, auch gleichzeitig für Java genutzt,
falls DB auf anderen Rechner oder mehrere Rechenkerne vorhanden sind und genutzt werden

kann aber sein, dass das gar nichts bringt oder durch die Verwaltung mehrerer Threads alles noch länger dauert als vorher
 
Zuletzt bearbeitet von einem Moderator:

Sekundentakt

Bekanntes Mitglied
Falls Du mehrere Festplatten parallel verwenden kannst, kannst Du auch mehrere schreibende Threads einsetzen, sofern diese auf verschiedene Platten schreiben.

Falls Du eine SSD verwendest, kannst Du - korrigiert mich, wenn ich falsch liege - sogar parallel mit verschiedenen Threads auf die selbe Festplatte schreiben.

Je nach Hardware-Ausstattung gibt's also verschiedene Möglichkeiten, die Software anzupassen. Es existiert keine echte One-Size-Fits-All.

Aber mal aus Neugier: Warum speicherst Du die Datei überhaupt in einer Datenbank? Datenbanken sind in der Regel nicht dafür gemacht worden, Dateien zu speichern. Sinnvoller wäre es, den Pfad zur Datei in der DB vorzuhalten und die Datei dann über den angegebenen Pfad zu erfragen. Das schont zusätzlich Deine Ressourcen.

Ergänzend zu SlaterB's Link Tuning Java I/O Performance
 

Sekundentakt

Bekanntes Mitglied
Magst Du das Ergebnis nicht auch noch mal posten?
Falls jemand ein ähnliches Problem hat, kann er sich dann anschauen, wie Du das gelöst hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
D sql query in methode mit rückgabetyp Datenbankprogrammierung 14
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
C Seitensystem mit seek Methode Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 2
D Insert Methode per Servlet Datenbankprogrammierung 0
J Datenbank: Methode wegen doppelten User Datenbankprogrammierung 1
N tableChanged Methode - AbstractTableModel Datenbankprogrammierung 2
W Methode createStatement() Datenbankprogrammierung 14
S Hibernate und Set-Methode Datenbankprogrammierung 16
A update methode für datenbank Datenbankprogrammierung 2
A Insert Methode Syntaxfehler Datenbankprogrammierung 2
J Methode Datenbankprogrammierung 5
R Effiziente Java-Methode zum finden eines freien PK Datenbankprogrammierung 7
K Schnelle Methode um zu testen ob Datensatz existiert Datenbankprogrammierung 9
G Effektive Methode zum durchsuchen von SQL-Datenbanken Datenbankprogrammierung 7
A Problem mit der Methode setFieldDelimiter("'"); Datenbankprogrammierung 3
L Methode, die Veränderungen in Datenbank zeigt? Datenbankprogrammierung 4
T Methode getColumnIndex(String columnName) ? Datenbankprogrammierung 6
A Blob in Oracle-DB einfügen (veraltete Methode) Datenbankprogrammierung 3
B Methode .next() - das Rätsel für Experten! URGENT Datenbankprogrammierung 2
G SQL-Query Methode Datenbankprogrammierung 4
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
D H2 schema-Datei ausführen Datenbankprogrammierung 22
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
J JAR-Datei und Datenbank Datenbankprogrammierung 8
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Jar-Datei stellt keine Datenbankverbindung her Datenbankprogrammierung 3
L CSV Datei mit DB Inhalt vergleichen Datenbankprogrammierung 20
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
T Datei auf Desktop ausgeben Datenbankprogrammierung 22
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
M HSQLDB .Script-Datei entfernen oder sperren Datenbankprogrammierung 18
M MySQL JSON-Datei auf Datenbank anwenden Datenbankprogrammierung 17
V SQLite Performance: 1 Datei mit einzelnen Einträgen gegenüber SQLite Datenbankprogrammierung 7
M Verbindung von Java Programm zur Acccess Datenbank (mdb-Datei) Datenbankprogrammierung 0
J SQL Datei einlesen/beschreiben Datenbankprogrammierung 0
F JPA persistence.xml mit EXTERNER Config Datei Datenbankprogrammierung 0
C VDF Datei als Datenbank genutzt!!! Datenbankprogrammierung 5
L SQL2SMO JAR-Datei zum Laufen bringen Datenbankprogrammierung 0
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
D [xBaseJ] Datei kann nicht geöffnet werden Datenbankprogrammierung 2
L Werte in Datei speichern Datenbankprogrammierung 16
D Datenbank oder XML Datei Datenbankprogrammierung 3
M HSQLDB oder DERBY - warum SCRIPT Datei? Datenbankprogrammierung 0
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
T 3 GB Große CSV Datei einlesen und in SQL-DB schreiben Datenbankprogrammierung 12
T Datei import und Datumsformat Datenbankprogrammierung 4
D Derby Datenbank bei Export zu JAR-Datei nicht möglich Datenbankprogrammierung 8
K SQLite CSV-Datei einlesen in eine Datenbank Datenbankprogrammierung 7
E csv datei in JTable einlesen Datenbankprogrammierung 3
E Datei Zippen und an DB schicken Datenbankprogrammierung 7
N Oracle txt. Datei auslesen-> verändern-> einlesen Datenbankprogrammierung 7
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
D MySQl Treiber in .jar Datei einbinden, Bukkit Datenbankprogrammierung 2
M Datenbank-Datei Datenbankprogrammierung 10
bluerob MimeMessage .getFrom()[0]; liest eml-Datei nicht Datenbankprogrammierung 7
achillesat ausgelesene Datei in Datenbank schreiben Datenbankprogrammierung 9
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
F Große Datei in MySQL importieren Datenbankprogrammierung 10
H Derby SQL-Abfragen in Datei abspeichern Datenbankprogrammierung 2
S passwortgeschützte Excel-Datei einlesen Datenbankprogrammierung 3
C XLS Datei aus Datenbank erstellen Datenbankprogrammierung 14
H Datenbank in Datei speichern / laden Datenbankprogrammierung 8
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
H CSV Datei in MSSQL DB oder doch SQL Script Datenbankprogrammierung 11
N Problem mit dem Importieren der csv- u. txt-Datei Datenbankprogrammierung 3
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
M Tabelle in Access Datei mit JDBC generieren Datenbankprogrammierung 3
N csv datei erstellen Datenbankprogrammierung 2
S BLOB in Datei speichern Datenbankprogrammierung 8
S projektplanung mit csv datei Datenbankprogrammierung 2
M Gelöst: JavaDB - Derby Inhalt in Jar Datei speichern Datenbankprogrammierung 5
K jar Datei startet nicht aufgrund Firebird(?) Datenbankprogrammierung 3
D Access Datenbank in .jar-Datei Datenbankprogrammierung 51
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
M H2 DAtenbank in .sql datei schreiben/abfragen ? Datenbankprogrammierung 3
A Auslesen von Werten aus der DB in eine csv-Datei Datenbankprogrammierung 4
T Wie kann ich Blobs (Bilder) in einer Datei speichern? Datenbankprogrammierung 2
A Auslesen aus einer csv-Datei Datenbankprogrammierung 2
A Einlesen einer csv-Datei in eine H2-Datenbank Datenbankprogrammierung 3
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
N csv datei in PostgreSQL datenbank einlesen Datenbankprogrammierung 1
M Mit Java .txt-Datei in eine Datenbank einlesen lassen Datenbankprogrammierung 33
ARadauer datenbank in datei sichern Datenbankprogrammierung 4
B HSQLDB und die log-Datei Datenbankprogrammierung 10
S [Hibernate] Map in Map - Wie sieht Mapping Datei aus? Datenbankprogrammierung 10
F Probleme mit Jar Datei Datenbankprogrammierung 3
T Datei (Blob) mit verknüpfter Software öffnen? Datenbankprogrammierung 4
M Problem: Große Datei in MySQL DB importieren. Datenbankprogrammierung 12
P ODBC verbindung Java soll auf access mdb datei zugreifen Datenbankprogrammierung 2
S SQLite oder RDBMS als Datei(nicht Client/Server) Datenbankprogrammierung 5
G .jar - Datei erzeugen (Was beachten?) Datenbankprogrammierung 2
R Mit JAR-Datei ist MySQL-Treiber nicht auffindbar Datenbankprogrammierung 10
Y Problem mit Ablage einer Datei in einer Datenbank als BLOB Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben