2012-08-31 34 views
6

Tôi đã cố gắng chèn dữ liệu BLOB với nhà phát triển SQL. Nhưng tôi không thể tìm thấy các câu lệnh chèn được sử dụng để chèn dữ liệu BLOB.Các cách chèn và lấy dữ liệu BLOB từ cơ sở dữ liệu Oracle bằng cách sử dụng SQL là gì?

Ngoài ra, tốc độ cơ sở dữ liệu thực sự chậm. Đối với các tệp nhỏ, nó thực thi tốt. Nhưng khi tôi cố gắng nhập 50 mb tập tin avi vào BLOB, mất 3-4 phút & vẫn chưa hoàn thành. Khi tôi cố gắng xuất dữ liệu BLOB vào một tệp, quá trình xuất cũng chậm. Tôi đã sử dụng Oracle 10g Express Edition. Nếu tốc độ cơ sở dữ liệu chậm hơn tốc độ hệ thống tập tin, thì tại sao cơ sở dữ liệu được sử dụng để lưu trữ dữ liệu BLOB? Có cách nào khác để tối ưu hóa hiệu suất không?

+0

tôi không bao giờ khuyên bạn sử dụng các đốm màu để lưu trữ các file - chỉ cần đặt chúng trên một hệ thống tập tin và lưu trữ tài liệu tham khảo để các tập tin ... –

+0

tôi sẽ nghĩ rằng 'BLOB's sẽ gần như luôn luôn được lưu trữ trong hệ thống tệp và một con trỏ đến thư mục dữ liệu được định nghĩa trong 'dba_directories' (như siêu dữ liệu). Oracle cung cấp một số chức năng trong gói 'webutil' của nó để chèn' BLOB 'vào một bảng nhưng sau đó sẽ có ngữ cảnh cho người dùng tải lên một tệp (nói' .avi') thông qua một ứng dụng từ (dựa trên 'Oracle Forms' hoặc 'Apex', v.v.). Một cách khác là sử dụng 'dbms_lob.fileopen' &' dbms_lob.loadfromfile' để khởi tạo 'BLOB' var của bạn và sau đó thực hiện chèn nhưng một lần nữa hiệu suất là một mối quan tâm ở đây. – Annjawn

+0

@NWest Nếu bạn đang đề xuất lưu trữ BLOB trong hệ thống tệp thì tại sao mọi ứng dụng web chuyên nghiệp lại sử dụng cơ sở dữ liệu mạnh mẽ làm dịch vụ back-end? Nếu bất cứ ai lưu trữ phần lớn dữ liệu của tôi trong hệ thống tệp thì tại sao tất cả mọi người sẽ cần một cơ sở dữ liệu? Họ có thể lưu trữ thông tin chỉ trong tập tin xml hoặc mdb và truy xuất chúng khi được yêu cầu !!!! –

Trả lời

5

Trước hết, bạn nên mong đợi lưu trữ BLOB trong cơ sở dữ liệu (đôi khi hơi chậm hơn một chút), nhưng không nhanh hơn lưu trữ chúng trong hệ thống tệp. Những lý do để lưu trữ chúng trong một DB không tập trung về hiệu suất, nhưng về ví dụ:

  • thiếu thông tin về hệ thống tập tin (chia sẻ) trong một cân bằng tải kịch bản
  • Dễ sao lưu nhóm hay: Quá trình đơn, aot 2 quy trình khi tệp và DB được sử dụng
  • An toàn giao dịch: BLOB có ở đó và hoàn thành hay không, nhưng không ở trong giai đoạn nửa nướng
  • những người khác mà tôi không thể nghĩ ra ngay bây giờ.

Nguyên tắc chung là, nếu không ai trong số này lo lắng cho bạn, bạn nên lưu trữ tệp của mình dưới dạng tệp .... Lưu trữ siêu dữ liệu và tên đường dẫn trong DB là IMHO thực hành tốt và phổ biến.

Liên quan đến điều chỉnh Oracle: Có sách được viết về điều đó. Tôi nghi ngờ tổng số chúng vượt quá một tấn ở định dạng cây chết-bìa mềm. Trước tiên bạn có thể xem xét quá trình tiêu thụ bộ nhớ của Oracle - quy tắc của ngón tay cái: Nếu nó nhỏ hơn một buổi biểu diễn và bạn sử dụng BLOB, bạn đang gặp rắc rối. Đọc trên các hồ bơi bộ nhớ khác nhau và cách tăng chúng. Một số giới hạn cho ấn bản nhanh có thể áp dụng.

+0

Đôi khi bạn muốn có thể truy cập (chính xác) cùng một tệp từ các máy khác nhau ở các vị trí khác nhau. Nếu bạn có một DB trung tâm, nó có thể là một giải pháp tốt (nếu không bạn sẽ phải đồng bộ từng tệp với tất cả các máy và xử lý các vấn đề đồng bộ hóa có thể). – alfasin

+1

+1 "bạn nên lưu trữ tệp của mình dưới dạng tệp ..." –

+0

@alfasin: Đây chính là điều mà viên đạn đầu tiên bao gồm: * Không có hệ thống tệp (chia sẻ) *. Trong thực tế bạn thay thế một hệ thống tập tin với một cơ sở dữ liệu. –

1

Đây không phải là mã bạn có thể sử dụng với nhà phát triển sql của mình, đó là mã Java sử dụng StringBuffer để INSERT một blob. Hy vọng nó sẽ hữu ích:

private void addBlob(oracle.jdbc.OracleConnection oracleConn, StringBuffer content) throws Exception 
{  
     PreparedStatement st = null; 
     try {     
      oracle.sql.BLOB blob = oracle.sql.BLOB.createTemporary(oracleConn, true, oracle.sql.BLOB.DURATION_SESSION); 

      blob.setBytes(1, content.toString().getBytes("UTF-8")); 

      st = oracleConn.prepareStatement("INSERT INTO MYTABLE (id, content) VALUES (MYTABLE_S.NEXTVAL, ?)"); 
      st.setBlob(1, blob); 
      st.execute(); 
      st.close(); 
     } 
     catch (Exception e) { 
      utils.writeLog("Blob insertion Failed", e, utils.ERR); 
      throw e; 
     }   
     finally{ 
      st.close(); 
     } 
    } 
Các vấn đề liên quan