Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Blob and PostgreSQL

Hi Andreas,

I think it would be a good idea to enter an enhancement request about this issue so we can make the solution easier.

Based on what you have said, I wonder if you want to Map your BLOB object, or just have a utility that accesses it. Do you make any use of the LOB object aside from during a read or a write in a transaction?

Currently, by default, when reading EclipseLink will read all the data in the BLOB by default - the reason is because after we are done with the connection, we will not have that option anymore. We implement a way of making fields mapped to LOBs LAZY, to avoid loading them when they are not needed, but that does not avoid loading them all at once when they are loaded. To workaround that issue, you just need to tell EclipseLink they are something other than a BLOB. A Customizer like this should workaround the Read issue:

public class MyCustomizer implements org.eclipse.persistence.config.SessionCustomizer {
    public void customize(Session session) {
        session.getEventManager().addListener(new SessionEventAdapter() {
            public void postLogin(SessionEvent event) {
ClassDescriptor desc = event.getSession().getDescriptor(MyEntity.class); DatabaseMapping mapping = desc.getMappingForAttributeName("myLobAttributeName");
                mapping.getField().setSqlType(Types.OTHER);
            }
        });
    }
}

This code should also gets us quite close to being able to write. The only issue that gets in the way is the fact the PostGres will not let us do a createBLOB. I am still looking in to the best way to get around that issue.

-Tom

On 24/06/2013 4:12 PM, Andreas Joseph Krogh wrote:
På mandag 24. juni 2013 kl. 21:57:22, skrev Tom Ware <tom.ware@xxxxxxxxxx
<mailto:tom.ware@xxxxxxxxxx>>:

    Lets say you get a LOB using an OID.  Does the connection you initially read it
    with need to stay open in order to get the stream?  (If so, that will be a
    challenge given the constraints of the JPA world).  If not, what code would you
    write to get the stream?  Do you keep the stream open for a long period of time?
       Do you need a connection for the duration of the time that you use it?

What I need is large files (not fit in RAM) to be part of a transaction when
writing data. The streams won't be open for any longer than the time it takes to
read/write the data.
I come from the Hibernate world and I'm heading for porting our app to EL as
Hibernate gives us  way too much trouble. But in order to do this I have a
sample-app where I test stuff so that I'm sure stuff works the way I want before
porting the app (~190K JAVA code and 90K Scala-code).
When it comes to handelign LOBs I need something like this:
For retreival:
doInTransaction{
MyEntity e = myRepository.find(PK)
StreamUtils.copy(e.getBlob.getBinaryStream, outputStream)
}
For creation (Hibernate pseudo-code):
doInTransaction{
             LobHelper lobHelper = session.getLobHelper
             Blob blob = lobHelper.createBlob(f.fileStream, f.length)
             myEntity.setBlob(blob)
}
PG's jdbc-driver doesn't implement Connection.createBlob so Hibernate uses a
BlobProxy (org.hibernate.engine.jdbc.BlobProxy) which does goes around this.
Are there any examples around using PG with Blobs, using streams (not byte[]) ?
--
Andreas Joseph Krogh <andreak@xxxxxxxxxxxx>      mob: +47 909 56 963
Senior Software Developer / CTO - OfficeNet AS - http://www.officenet.no
Public key: http://home.officenet.no/~andreak/public_key.asc


_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top