PostgreSQL™ provides two distinct ways to store binary data. Binary data can be stored in a table using the data type bytea or by using the Large Object feature which stores the binary data in a separate table in a special format and refers to that table by storing a value of type oid in your table.
In order to determine which method is appropriate you need to understand the limitations of each method. The bytea data type is not well suited for storing very large amounts of binary data. While a column of type bytea can hold up to 1 GB of binary data, it would require a huge amount of memory to process such a large value. The Large Object method for storing binary data is better suited to storing very large values, but it has its own limitations. Specifically deleting a row that contains a Large Object reference does not delete the Large Object. Deleting the Large Object is a separate operation that needs to be performed. Large Objects also have some security issues since anyone connected to the database can view and/or modify any Large Object, even if they don't have permissions to view/update the row containing the Large Object reference.
Version 7.2 was the first release of the JDBC driver
that supports the bytea data type. The introduction of
this functionality in 7.2 has introduced a change in behavior
as compared to previous releases. Since 7.2, the methods
getBytes()
, setBytes()
,
getBinaryStream()
, and
setBinaryStream()
operate on
the bytea data type. In 7.1 and earlier, these methods operated
on the oid data type associated with Large Objects.
It is possible to revert the driver back to the old 7.1 behavior
by setting the property compatible
on
the Connection
object to the value
7.1
. More details on connection properties are
available in the section called “Connection Parameters”.
To use the bytea data type you should simply use
the getBytes()
, setBytes()
,
getBinaryStream()
, or
setBinaryStream()
methods.
To use the Large Object functionality you can use either the
LargeObject
class provided by the
PostgreSQL™ JDBC driver, or by
using the getBLOB()
and
setBLOB()
methods.
You must access Large Objects within an SQL
transaction block. You can start a transaction block by calling
setAutoCommit(false)
.
Example 7.1, “Processing Binary Data in JDBC” contains some examples on how to process binary data using the PostgreSQL™ JDBC driver.