There are 3 different ways to get data out of a BLOB
column from a ResultSet
getBytes
getBinaryStream
getBlob
Also, the Blob
object returned by getBlob
also has getBytes
and getBinaryStream
methods available on it.
Are there any particular reasons (performance, memory, database specific problems) that I should pick one over the other?
The Blob
object also has a free()
call that has been introduced since JDBC 4.0. Does that make a difference?
A BLOB (binary large object) is a varying-length binary string that can be up to 2,147,483,647 characters long. Like other binary types, BLOB strings are not associated with a code page. In addition, BLOB strings do not hold character data.
Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes. This byte array contains up to length consecutive bytes starting at position pos .
An SQL BLOB is a built-in type that stores a Binary Large Object as a column value in a row of a database table. By default drivers implement Blob using an SQL locator(BLOB) , which means that a Blob object contains a logical pointer to the SQL BLOB data rather than the data itself.
At first, I have created an object of Scanner class and read my file using FileReader() method. Then created a BLOB object initialized with null. Next, I have Converted the file into a Byte array ( byte[] ), stored it into my_byte_array. Finally converted the byte array into BLOB using SerialBlob() method.
If you're going to be pulling a lot of data (i.e. enough data to cause memory problems), then getBinaryStream will give you most flexibility to process and discard the data as you read it in.
On the other hand, this could be quite slow, depending on your JDBC driver, since each read from the stream could entail a lot of network chatter with the database. If you call getBytes, then the driver knows to fetch the whole lot in one go, which is likely to be more efficient.
getBlob() returns a "pointer" to the data, which you can manipulate using the methods on the Blob interface. If you need to modify or otherwise get fancy with the data in-situ, then this might be best for you.
Generally you want to pick the stream-based methods (i.e. getBlob().getBinaryStream() or getBinaryStream()) rather than the byte-array method.
Worst-case is the database (or JDBC driver) doesn't truly support streaming binary data, but then there's still no appreciable penalty for using the streaming methods.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With