在字节数组和二进制(BLOB)中存储图像之间的区别以及哪一个更快
2022-09-03 15:13:30
我想在jdbc中插入并选择来自sql服务器的图像。我很困惑BLOB和byte是一回事还是不同。我在代码中使用了Blob,应用程序加载速度很慢,因为它必须选择存储在Blob中的图像并逐个像素地转换它。我想使用字节数组,但我不知道它们是相同还是不同。我的主要目标是更快地加载图像。谢谢
我想在jdbc中插入并选择来自sql服务器的图像。我很困惑BLOB和byte是一回事还是不同。我在代码中使用了Blob,应用程序加载速度很慢,因为它必须选择存储在Blob中的图像并逐个像素地转换它。我想使用字节数组,但我不知道它们是相同还是不同。我的主要目标是更快地加载图像。谢谢
在进一步讨论之前,我们可能需要记住有关位,字节和二进制,BLOB的基本概念。
位:二进制数字的缩写。它是最小的存储单元。位可以采用 0 或 1 的值。
Byte:通常使用的第二小存储(nibble没有被提及,因为它不是很常见的术语)。它包括八位。
二进制:实际上,这是一种编号方案,即数字的每个数字都可以取值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类型。
但!这不是最佳做法。
因为数据库被设计用来存储数据,而文件系统被设计用来存储文件。
从磁盘读取图像是一件简单的事情。但是,从数据库中读取图像需要更多的时间来完成(查询数据,转换为数组,反之亦然)。
在读取图像时,它会导致数据库性能下降,因为它不是简单的文本或数字读取。
图像文件不能从数据库的特征性功能(如索引)中受益
此时,最佳做法是将该映像存储在服务器上,并将其路径存储在数据库中。
据我所知,在企业级项目上,图像很少存储在数据库中。在这种情况下,这些图像需要加密存储,因为它们包含非常感性的数据。根据我的拙见,即使在这种情况下,这些数据也不必存储在数据库中。
Blob 只是表示(二进制大型对象),这是数据库存储字节数组的方式。
希望这很简单,它回答了你的问题。