تخزين البيانات الضخمة بقاعدة البيانات اوراكل بواسطة الجافا
|
بسم الله الرحمن الرحيم
هل لديك مشروع و تريد تخزين و استرجاع البيانات من صور و مقاطع صوتية و مرئية بقاعدة بيانات Oracle؟
هذا الدرس سوف تقوم من خلاله بعمل المطلوب. و سوف نقوم باستعراض الدرس بالشفرات البرمجية المطلوبة لفهم الموضوع على أكمل وجه (و الكمال لله تعالى).
الـ BLOB و الـ CLOB: و هي اختصار لـ Binary Large Object و اختصار لـ Character Large Object. من ناحية أخرى، هذان النوعان صمما لحفظ و استرجاع البيانات الضخمة بقاعدة البيانات. و التي تصل سعة التخزين إلى أربع جيجابايت (4 GB) من البيانات. و هما من الأنواع التي توجد بالـ SQL3، و التي هي مدعومة من الـ JDBC 2.0. الـ JDBC 2.0 تخدم نوعان جديدان و هما الـ BLOB و الـ CLOB للتعامل مع الأنواع الجديدة من الـ SQL3. و بهذا الدرس سوف نستخدم الـ BLOB لتخزين و استرجاع الصور من و إلى قاعدة البيانات.
أولاً سوف نقوم بإنشاء جدول جديد باستخدام SQL Plus أو بأي طريقة أخرى و نسميه demo:
CREATE TABLE demo (id NUMBER(6), image BLOB);
كما تلاحظ يوجد لدينا عمودان. الأول و هو مخصص لإضافة رقم خاص لكل صورة و هو من نوع NUMBER، و العمود الثاني و هو لتخزين البيانات (مثل: الصور و المقاطع الصوتية و المرئية) و هو من نوع BLOB.
سوف نقوم باستعراض أربع أمور:
تخزين البيانات بقاعدة البيانات: الآن سوف نقوم بكتابة شفرة برمجية بلغة الجافا لتخزين الصور بقاعدة بيانات Oracle.
الشفرة البرمجية:
import java.io.*; import java.sql.*; import oracle.sql.BLOB; import oracle.jdbc.driver.*;
public class WriteBlob { private Connection con; private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2"; private String user = "scott"; private String password = "tiger";
public WriteBlob() { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); con = DriverManager.getConnection(url, user, password); } catch (SQLException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } public static void main(String[] args) throws Exception, IOException { new WriteBlob().process(); } public void process() throws IOException, SQLException { int rows = 0; FileInputStream fin = null; OutputStream out = null; ResultSet rslt = null; Statement stmt = null; BLOB photo = null; // NOTE: oracle.sql.BLOB!!! long person_id = 0;
try { con.setAutoCommit(false); stmt = con.createStatement(); rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT"); while (rslt.next()) { rows++; photo = (BLOB)rslt.getBlob("image"); } rslt.close(); rslt = null; /** * If it doesn't exist, then insert a row in the information table * This creates the LOB locators */ if (rows == 0) { rows = stmt.executeUpdate("INSERT INTO demo VALUES (1, empty_blob())"); System.out.println(rows + " rows inserted"); // Retrieve the locator rows = 0; rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT"); rslt.next(); photo = ((OracleResultSet)rslt).getBLOB("image"); rslt.close(); rslt = null; } stmt.close(); stmt = null; // Now that we have the locator, lets store the photo File binaryFile = new File("jfc.gif"); fin = new FileInputStream(binaryFile); out = photo.getBinaryOutputStream(); // Get the optimal buffer size from the BLOB byte[] buffer = new byte[photo.getBufferSize()]; int length = 0; while ((length = fin.read(buffer)) != -1) { out.write(buffer, 0, length); } // you need to close the output stream before // you commit, or the changes are lost! out.close(); out = null; fin.close(); fin = null; con.commit(); } catch (SQLException e) { System.err.println("SQL Error: " + e.getMessage()); } catch (IOException e) { System.err.println("IO Error: " + e.getMessage()); } finally { if (rslt != null) { try { rslt.close(); } catch (SQLException ignore) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException ignore) {} } if (out != null) { try { out.close(); } catch (IOException ignore) {} } if (fin != null) { try { fin.close(); } catch (IOException ignore) {} } } } protected void finalize() throws Throwable { if (con != null) { try { con.close(); } catch (SQLException ignore) {} } super.finalize( ); } }
و الآن سوف نقوم بشرح مبسط للشفرة البرمجية السابقة:
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2"; private String user = "scott"; private String password = "tiger";
هنا سوف نقوم بتحديد نوع الـ Driver و بالمثال السابق استخدمنا thin driver و قمنا بتحديد مكان قاعدة البيانات و هي موجودة بالجهاز المحلي و تحديد المنفذ و هو 1521 و حددنا اسم الـ SID لقاعدة البيانات و هي ORCL2 (يجب تغيير المتغيرات عند الحاجة لذلك). و قمنا أيضاً بتحديد اسم المستخدم و كلمة المرور له.
rows = stmt.executeUpdate("INSERT INTO demo VALUES (1, empty_blob())"); System.out.println(rows + " rows inserted"); // Retrieve the locator rows = 0; rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT"); rslt.next(); photo = ((OracleResultSet)rslt).getBLOB("image"); rslt.close(); rslt = null;
بعد ذلك قمنا بالاتصال بقاعدة البيانات (تستطيع قراءة الدرس السابق عن الاتصال بقاعدة البيانات بموقع الموسوعة العربية للكمبيوتر و الانترنت أو الفريق العربي للتكنولوجيا). و من ثم قمنا بإضافة BLOB فارغ (يجب أولاً إضافة empty_blob() لقاعدة البيانات و استرجاعها من قاعدة البيانات، و بعد ذلك نقوم بإرسال البيانات إلى قاعدة البيانات).
// Now that we have the locator, lets store the photo File binaryFile = new File("jfc.gif"); fin = new FileInputStream(binaryFile); out = photo.getBinaryOutputStream(); // Get the optimal buffer size from the BLOB byte[] buffer = new byte[photo.getBufferSize()]; int length = 0; while ((length = fin.read(buffer)) != -1) { out.write(buffer, 0, length); } // you need to close the output stream before // you commit, or the changes are lost! out.close(); out = null; fin.close(); fin = null; con.commit();
بالجزء السابق من الشفرة البرمجية نحدد اسم الملف (على سبيل المثال: jfc.gif)، و من ثم نقوم بتخزينه بقاعدة البيانات. و بعد ذلك قفل الملف و تنفيذ المطلوب بقاعدة البيانات لكي لا نخسر ما قمنا به.
استرجاع البيانات من قاعدة البيانات و حفظها على هيئة ملفات: الآن سوف نقوم باسترجاع البيانات (على سبيل المثال: الصورة السابقة) على الجهاز من قاعدة البيانات.
الشفرة البرمجية:
import java.io.*; import java.sql.*; import oracle.sql.*; import oracle.jdbc.*;
public class ReadBlob { private Connection con = null; private PreparedStatement pstmt = null; private ResultSet rs = null; private BLOB blob = null;
private String selectSQL = "SELECT image FROM demo WHERE id = ?"; private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2"; private String user = "scott"; private String password = "tiger";
public ReadBlob() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch(ClassNotFoundException e) { e.printStackTrace(); } try { con = DriverManager.getConnection(url, user, password); pstmt = con.prepareStatement(selectSQL); pstmt.setInt(1, 1); //for set the ID (line 13) rs = pstmt.executeQuery(); while(rs.next()) { blob = ((OracleResultSet)rs).getBLOB("image"); } InputStream blobStream = blob.getBinaryStream(); FileOutputStream fileOutStream = new FileOutputStream("abc.gif"); byte[] buffer = new byte[10]; int nbytes = 0; while ((nbytes = blobStream.read(buffer))!= -1) { fileOutStream.write(buffer,0,nbytes); } fileOutStream.flush(); fileOutStream.close(); blobStream.close(); rs.close(); pstmt.close(); con.close(); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) throws Exception { new ReadBlob(); } }
|