以字节数组和二进制(BLOB)存储图像与哪一个更快之间的区别

时间:2014-09-08 10:51:42

标签: java sql-server jdbc byte blob

我想在jdbc中插入并从sql server中选择图像。我很困惑BLOB和byte是相同的还是不同的。我在我的代码中使用了Blob,并且应用程序加载速度很慢,因为它必须选择存储在Blob中的图像并逐个像素地进行转换。我想使用字节数组,但我不知道它们是相同还是不同。我的主要目标是加快图像加载速度。 谢谢

2 个答案:

答案 0 :(得分:2)

在继续之前,我们可能需要记住有关BLOB的位,字节和二进制的基本概念。

位:二进制数字的缩写。它是最小的存储单元。位可以取0或1的值。

Byte:第二个最小的存储,通常使用(没有提到半字节,因为它不是很普通的术语)。它包括八位。

二进制:实际上,这是一种编号方案,数字的每个数字可以取0或1的值。

BLOB:一组存储在数据库中的二进制数据。另外,在其中存储二进制数据的列的类型。

总结定义:二进制格式是一种包含位的方案。

更具体地说,我们可以使用以下代码观察结果。

import java.nio.ByteBuffer;

public class TestByteAndBinary{

     public static void main(String []args){
        String s = "test"; //a string, series of chars
        System.out.println(s);

        System.out.println();

        byte[] bytes = s.getBytes(); //since each char has a size of 1 byte, we will have an array which has 4 elements
        for(byte b : bytes){
            System.out.println(b);
        } 

        System.out.println();

        for(byte b : bytes){
            String c = String.format("%8s", Integer.toBinaryString(b)).replace(' ', '0'); //each element is printed in its binary format
            System.out.println(c);
        }
     }
}

输出:

$javac TestByteAndBinary.java
$java -Xmx128M -Xms16M TestByteAndBinary
test

116
101
115
116

01110100
01100101
01110011
01110100

让我们回到问题: 如果您确实要在数据库中存储图像,则必须使用BLOB类型。

但是!这不是最佳做法。

  • 因为数据库旨在存储数据,而文件系统 设计用于存储文件。

  • 从磁盘读取图像很简单。但是从中读取图像 数据库需要更多时间才能完成(查询数据, 转换为数组,反之亦然)。

  • 正在读取图像时,它将导致数据库损坏 表现不佳,因为它不是简单的文本或数字阅读。

  • 图像文件无法从数据库的特征中受益(例如索引)

目前,最佳做法是将该映像存储在服务器上,并将其路径存储在数据库中。

据我所见,在企业级项目中,图像很少存储在数据库中。情况就是这些图像需要存储加密,因为它们包含非常敏感的数据。根据我的拙见,即使在那种情况下,也不必将这些数据存储在数据库中。

答案 1 :(得分:0)

Blob 只是意味着(二进制大对象)及其数据库存储字节数组的方式。

希望这很简单并且能回答您的问题。