Page Nav

HIDE
{fbt_classic_header}

Terbaru :

latest

Cara Input Gambar ke postgreSQL Menggunakan bytea dan Large Object

PostgreSQL menyediakan dua cara yang berbeda untuk menyimpan data biner, yaitu : 1. Data biner dapat disimpan dalam sebuah tabel den...

PostgreSQL menyediakan dua cara yang berbeda untuk menyimpan data biner, yaitu :

1. Data biner dapat disimpan dalam sebuah tabel dengan menggunakan tipe data "bytea" atau
2. Data biner disimpan dengan menggunakan fitur "Large Object" dimana data biner disimpan dalam tabel terpisah dalam format khusus dan mengacu pada tabel tersebut dengan menyimpan nilai tipe oid di dalam tabel.

Untuk menentukan metode mana yang tepat, perlu dipahami keterbatasan dari setiap metode. Tipe data bytea tidak cocok untuk menyimpan data biner yang berukuran besar. Kolom jenis bytea dapat menyimpan hingga 1 GB data biner, maka diperlukan sejumlah besar memori untuk memproses ukuran/nilai yang besar.


Metode Large Object lebih cocok untuk menyimpan data biner berukuran besar. Namun demikian metode ini juga memiliki keterbatasan sendiri. Terutama dalam menghapus baris yang berisi Large Object Reference tidak menghapus Object besar. Menghapus Large Object adalah operasi terpisah yang perlu dilakukan. Objek besar juga memiliki beberapa masalah keamanan karena siapa saja yang terhubung ke database dapat melihat dan / atau memodifikasi Large Object, bahkan jika mereka tidak memiliki izin untuk melihat / memperbarui baris yang berisi referensi Large Object.

Versi 7.2 adalah rilis pertama dari driver JDBC yang mendukung tipe data bytea. Pengenalan fungsi ini di 7,2 telah memperkenalkan perubahan perilaku dibandingkan dengan rilis sebelumnya. Sejak versi 7,2, metode getBytes(), setBytes(), getBinaryStream(), dan setBinaryStream() beroperasi pada tipe data bytea.

Pada versi 7.1 dan versi sebelumnya, metode ini dioperasikan pada jenis data oid yang terkait dengan Large Objects. Hal ini memungkinkan untuk kembali ke perilaku versi yang lama, 7.1, dengan menetapkan properti kompatibel pada objek Connection dengan nilai 7.1.

Untuk menggunakan tipe data bytea kita hanya harus menggunakan metode getBytes(), setBytes(), getBinaryStream (), atau setBinaryStream().

Untuk menggunakan fungsi Large Obyek, kita dapat menggunakan LargeObject Class yang disediakan oleh driver PostgreSQL JDBC, atau dengan menggunakan metode getBLOB() dan setBLOB().

Penting: You must access Large Objects within an SQL transaction block. You can start a transaction block by calling setAutoCommit(false).

Catatan: In a future release of the JDBC driver, the getBLOB() and setBLOB() methods may no longer interact with Large Objects and will instead work on the data type bytea. So it is recommended that you use the LargeObject API if you intend to use Large Objects.

Contoh 1 :
Siapkan tabel dengan kolom images bertipe data bytea.

CREATE TABLE images (imgname text, img bytea);

Untuk memasukkan gambar , gunakan :


File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis, file.length());
ps.executeUpdate();
ps.close();
fis.close();

Di sini, setBinaryStream() mentransfer sejumlah set byte dari berkas ke dalam kolom jenis bytea. Hal ini juga bisa dilakukan dengan menggunakan metode setBytes() jika isi dari gambar itu sudah dalam byte[].

Untuk menampilkan gambar bahkan lebih mudah. (Gunakan PreparedStatement, tapi Statement Class dapat sama-sama digunakan.).

PreparedStatement ps = con.prepareStatement("SELECT img FROM images WHERE imgname = ?");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) {
    while (rs.next()) {
        byte[] imgBytes = rs.getBytes(1);
        // use the data in some way here
    }
    rs.close();
}
ps.close();


Di atas data biner diambil sebagai byte[]. Juga bisa menggunakan objek InputStream sebagai gantinya.

Contoh Menggunakan Large Object
Gunakan LargeObject API untuk menyimpan file:

CREATE TABLE imageslo (imgname text, imgoid oid);

Untuk menyisipkan gambar, Anda akan menggunakan:

// All LargeObject API calls must be within a transaction block
conn.setAutoCommit(false);

// Get the Large Object Manager to perform operations with
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();

// Create a new large object
int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);

// Open the large object for writing
LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);

// Now open the file
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);

// Copy the data from the file to the large object
byte buf[] = new byte[2048];
int s, tl = 0;
while ((s = fis.read(buf, 0, 2048)) > 0) {
    obj.write(buf, 0, s);
    tl += s;
}

// Close the large object
obj.close();

// Now insert the row into imageslo
PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslo VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setInt(2, oid);
ps.executeUpdate();
ps.close();
fis.close();

Untuk menampilkan gambar dari Large Object :

// All LargeObject API calls must be within a transaction block
conn.setAutoCommit(false);

// Get the Large Object Manager to perform operations with
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();

PreparedStatement ps = con.prepareStatement("SELECT imgoid FROM imageslo WHERE imgname = ?");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) {
    while (rs.next()) {
        // Open the large object for reading
        int oid = rs.getInt(1);
        LargeObject obj = lobj.open(oid, LargeObjectManager.READ);

        // Read the data
        byte buf[] = new byte[obj.size()];
        obj.read(buf, 0, obj.size());
        // Do something with the data read here

        // Close the object
        obj.close();
    }
    rs.close();
}
ps.close();

source: http://www.postgresql.org/docs/7.4/static/jdbc-binary-data.html



Tidak ada komentar