JDBC: Oracle Blob in MySQL Blob umwandeln



  • Hi,

    ich möchte ein Blob aus einer Oracle DB in eine MySQL DB portieren.

    Ich nutze folgende Treiber:

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    

    Ich bin dabei bisher wie folgt vorgegangen (verkürzter Code):

    // ... resultSet von Oracle DB holen ...
    Blob blob = resultSet.getBlob("C_POINTS"); // (der java.sql.Blob)
    
    // ... ein insert für nicht-binäre Datentypen zur MySQL DB - klappt auch prima ...
    
    // ... updaten der binären Daten, also des Blobs zur MySQL DB
    c.updateBlob(MYSQL, "t_layers", "c_points", entry.getC_POINTS()); // MYSQL (1) ist eine Konstante, damit die Methode weiss, ob sie Operationen auf der MySQL oder Oracle DB ausführen soll.
    
    // und irgendwo habe ich dann ne Methode updateBlob; dBServer kann ORACLE (0) oder MYSQL (1) sein
    public void updateBlob(int dBServer, String table, String column, Blob data) {
            try {
                PreparedStatement ps = connections[dBServer].prepareStatement("update " + table + " set " + column + "=?");
                ps.setBlob(1, data);
                ps.execute();
            } catch (SQLException e) {
                System.err.println("error on updating blob: " + e);
            }
        }
    

    Dabei gibt es aber 2 Probleme:

    1. Ich weiss nicht, ob ich dann in der MySQL Tabelle einen wirklich gültigen Blob drinne stehen habe,
      oder ob da nicht sowas, wie ein Header fehlt, bevor die wirklichen Daten anfangen. Bei den Oracle Blobs steht glaube ich immer sowas davor "oracle.sql.BLOB@152513a", also steht vielleicht bei den MySQL Blobs sowas davor mysql.sql.BLOB@152513a ???
      Ich habe leider keine genaue Beschreibung des Formats der jeweiligen Blobtypen gefunden. Wer etwas dazu weiss - her damit.

    2. JDBC bzw. der MYSQL Treiber mag anscheinend nicht mehr als 1 MB in einen Blob schreiben, denn ich bekomme nämlich für Blobs, die grösser als 1 MB sind folgende Exception (typ des blobs in der MySQL DB ist longblob):

    error on updating blob: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4438663 > 1048576)
    

    Anmerkung: Ich habe es anstatt mit den get-/ setBlob() Methoden auch schon mit den get-/ setBytes Methoden von den Blobs probiert -> selbes Problem.

    Ich wäre Euch sehr dankbar, wenn Ihr evtl. einen Tipp habt.



  • Ich glaube nicht, dass bei BLOBs in Oracle oder MySQL irgendwelche Header drinnen stehen. BLOB ist halt ein binary large object also ein Stream. Das was du siehst ist die Speicheradressierung von Java selbst denn ein toString() auf einen BLOB macht ja so gesehen keinen Sinn 🙂 Insofern kannst du ruhigen gewissens darauf vertrauen dass der BLOB korrekt eingetragen wird.

    Wie es sich mit der maximalen Größe des BLOB verhält kann ich dir leider auch nicht sagen. Ich schätze aber, dass die definierte Größe 1MB irgendwo in der mysql.ini des Servers drinnensteht.



  • Jo thx. Ich musste tatsächlich nur die max. Packetgrösse in der my.cnf anpassen.
    Das mit dem Blob passt auch so -> Ich weiss garnicht, wie ich auf die blöde Idee gekommen bin, dass das Ding nen Header haben könnte...die Anzeige des Blobs bei der Abfrage der Oracle DB hat mich wahrscheinlich etwas verwirrt.



  • Hi,

    Entschuldigung, aber : Was ist ein "Blob"?

    Gruss

    Oliver



  • Binary
    Large
    Object



  • AFAIR haben BLOBs in MySQL überhaupt keine Header. Normale Blobs (können glaub ich ~65534 Zeichen speichern) haben am Ende (oder am Anfang?) 2 Bytes, die angeben, wie viel denn nun wirklch drinsteht. Bei LongBlob sind es eben 4 Byte - die du aber niemals zu Gesicht bekommst - die werden beim Schreiben automatisch gesetzt und beim Lesen nicht zurückgeliefert.


Anmelden zum Antworten