Re: problem with LargeObject and commit - Mailing list pgsql-jdbc

From Marc Cousin
Subject Re: problem with LargeObject and commit
Date
Msg-id 230322962.Rq3IZRyTva@marco-dalibo
Whole thread Raw
In response to Re: problem with LargeObject and commit  (Dave Cramer <pg@fastcrypt.com>)
List pgsql-jdbc
Great, thanks :)

On Tuesday 15 October 2013 06:54:48 Dave Cramer wrote:
> Marc,
>
> I just pushed it to github, thanks!
>
> Dave Cramer
>
> dave.cramer(at)credativ(dot)ca
> http://www.credativ.ca
>
> On Tue, Oct 15, 2013 at 6:48 AM, Dave Cramer <pg@fastcrypt.com> wrote:
> > Marc,
> >
> > Sorry I have been travelling. Just looked at it, It's fine albeit more
> > than just changing the visibility of the function.
> >
> >  Dave Cramer
> >
> > dave.cramer(at)credativ(dot)ca
> > http://www.credativ.ca
> >
> > On Mon, Oct 14, 2013 at 10:38 AM, Marc Cousin <cousinmarc@gmail.com>wrote:
> >> Hi,
> >>
> >> Did you give it a look ?
> >>
> >> Regards
> >>
> >> Marc
> >>
> >> On Sunday 06 October 2013 19:14:41 Marc Cousin wrote:
> >> > Hi,
> >> >
> >> > Attached is an attempt to do this (git diff on head).
> >> >
> >> > The code seems to work. It has been tested on the program we are
> >>
> >> migrating
> >>
> >> > from SQL Server, we can now stream LOBs directly to web browsers...
> >> >
> >> > Please note that I am not usually a Java developper. I did my best to
> >> > do
> >> > this correctly, and the Java way (as far as I know :) ). If some things
> >>
> >> are
> >>
> >> > not done the right way, or there is a smarter solution, tell me, I'll
> >> > improve this.
> >> >
> >> > Regards,
> >> >
> >> > Marc
> >> >
> >> > On Tuesday 01 October 2013 08:11:21 Dave Cramer wrote:
> >> > > Well I don't see any reason not to open up the LOM class to allow you
> >>
> >> to
> >>
> >> > > extend it.
> >> > >
> >> > > Can you send a git pull?
> >> > >
> >> > > Dave Cramer
> >> > >
> >> > > dave.cramer(at)credativ(dot)ca
> >> > > http://www.credativ.ca
> >> > >
> >> > > On Tue, Oct 1, 2013 at 3:52 AM, Marc Cousin <cousinmarc@gmail.com>
> >>
> >> wrote:
> >> > > > Sorry, I don't think I get it, so please correct me below if I
> >>
> >> didn't.
> >>
> >> > > > I currently use getInputStream() on my large object. How could I
> >>
> >> provide
> >>
> >> > > > a
> >> > > > connection to the extended InputStream ? I am calling a LargeObject
> >> > > > method.
> >> > > >
> >> > > > Or maybe extend LargeObject to have a new getInputStream method
> >>
> >> with a
> >>
> >> > > > connection provided, and then provide this connection to the
> >>
> >> extended
> >>
> >> > > > InputStream ?
> >> > > >
> >> > > > My initial idea was to not have to provide the connection as a
> >> > > > parameter,
> >> > > > so I
> >> > > > wanted to use the Lob Manager.
> >> > > >
> >> > > > Anyway, shouldn't streaming a large object in this special case be
> >> > > > easier
> >> > > > to
> >> > > > do ? The original code (from SQL Server) didn't have to do all
> >> > > > these
> >> > > > workarounds, and I'll get this objection from people that will have
> >>
> >> to
> >>
> >> > > > use
> >> > > > this code :)
> >> > > >
> >> > > > Just having conn as protected instead of private in the
> >> > > > LargeObjectManager
> >> > > > would have made it possible to me to do it simply: I could have
> >>
> >> provided
> >>
> >> > > > the
> >> > > > connection to my extended LargeObject, and from there end the
> >> > > > transaction
> >> > > > on
> >> > > > close().
> >> > > >
> >> > > > Regards.
> >> > > >
> >> > > > On Monday 30 September 2013 17:08:18 Dave Cramer wrote:
> >> > > > > Marc,
> >> > > > >
> >> > > > > You required the connection to create the LargeObjectManager, so
> >>
> >> why
> >>
> >> > > > > not
> >> > > > > just extend the InputStream and add the connection to that
> >> > > > > object.
> >> > > > > When you close the input stream, close the connection ????
> >> > > > >
> >> > > > > Dave Cramer
> >> > > > >
> >> > > > > dave.cramer(at)credativ(dot)ca
> >> > > > > http://www.credativ.ca
> >> > > > >
> >> > > > > On Mon, Sep 30, 2013 at 11:18 AM, Marc Cousin <
> >>
> >> cousinmarc@gmail.com>
> >>
> >> > > > wrote:
> >> > > > > > Hi,
> >> > > > > >
> >> > > > > > I'm having the following problem: I need to stream a LOB to a
> >>
> >> web
> >>
> >> > > > client,
> >> > > >
> >> > > > > > without consuming
> >> > > > > > a lot of memory. So I am returning getInputStream() to the
> >>
> >> caller.
> >>
> >> > > > > > This works perfectly, except that I have to keep a transaction
> >>
> >> open
> >>
> >> > > > > > to
> >> > > > > > return the large object
> >> > > > > > stream, and I have (or found) no way of closing the transaction
> >>
> >> when
> >>
> >> > > > the
> >> > > >
> >> > > > > > filestream is closed.
> >> > > > > >
> >> > > > > > So of course, if I did that, I would get a lot of IDLE in
> >> > > > > > transaction
> >> > > > > > sessions...
> >> > > > > >
> >> > > > > > So the logical way seemed to me to extend LargeObjectManager
> >> > > > > > and
> >> > > > > > LargeObject to have a
> >> > > > > > close method on my LargeObject that closes the transaction,
> >>
> >> meaning
> >>
> >> > > > that
> >> > > >
> >> > > > > > my LargeObject
> >> > > > > > should have a connection attribute. So I wanted to do something
> >>
> >> like
> >>
> >> > > > this
> >> > > >
> >> > > > > > (not working,
> >> > > > > > it's just for the sake of explanation):
> >> > > > > >
> >> > > > > >
> >> > > > > > public class StreamLargeObjectManager extends
> >>
> >> LargeObjectManager{
> >>
> >> > > > > >            public StreamLargeObject openStreamLargeObject(long
> >>
> >> oid,
> >>
> >> > > > > >            int
> >> > > > > >
> >> > > > > > mode)
> >> > > > > >
> >> > > > > >              throws SQLException
> >> > > > > >
> >> > > > > >            {
> >> > > > > >
> >> > > > > >              LargeObject lo = super.open(oid, mode);
> >> > > > > >              StreamLargeObject so = new StreamLargeObject(lo,
> >> > > > > >
> >> > > > > > super.getConn()); //cannot be done because no access to
> >>
> >> connection
> >>
> >> > > > > >              return so;
> >> > > > > >
> >> > > > > >            }
> >> > > > > >
> >> > > > > > }
> >> > > > > >
> >> > > > > >
> >> > > > > > and
> >> > > > > >
> >> > > > > > public class StreamLargeObject extends
> >> > > > > > org.postgresql.largeobject.LargeObject{
> >> > > > > >
> >> > > > > >         Connection conn;
> >> > > > > >
> >> > > > > >         LargeObject lobj;
> >> > > > > >
> >> > > > > >
> >> > > > > >         public StreamLargeObject(LargeObject lg, BaseConnection
> >> > > > > >         conn)
> >> > > > > >
> >> > > > > > throws SQLException {
> >> > > > > >
> >> > > > > >                 this.lobj = lg;
> >> > > > > >                 this.conn = conn;
> >> > > > > >
> >> > > > > >         }
> >> > > > > >
> >> > > > > >
> >> > > > > >         @Override
> >> > > > > >         public void close() throws SQLException {
> >> > > > > >
> >> > > > > >                 lobj.close();
> >> > > > > >                 this.conn.commit();
> >> > > > > >
> >> > > > > >         }
> >> > > > > >
> >> > > > > >        public getInputStream() throws SQLException
> >> > > > > >
> >> > > > > >     {
> >> > > > > >
> >> > > > > >         return lobj.getInputStream();
> >> > > > > >
> >> > > > > >     }
> >> > > > > >
> >> > > > > > }
> >> > > > > >
> >> > > > > >
> >> > > > > > As the comment says it all, I cannot do this: conn is private
> >> > > > > > in
> >> > > > > > LargeObjectManager. For now, the problem has been
> >> > > > > > worked around by duplicating all the LargeObjectManager code,
> >>
> >> but
> >>
> >> > > > > > this
> >> > > >
> >> > > > is
> >> > > >
> >> > > > > > obviously ugly and not
> >> > > > > > maintainable. So my question is: have I missed some obvious
> >>
> >> solution
> >>
> >> > > > > > ?
> >> > > > > > Could a getter be added to
> >> > > > > > the LargeObjectManager's connection ?
> >> > > > > >
> >> > > > > > Regards,
> >> > > > > >
> >> > > > > > Marc
> >> > > > > >
> >> > > > > >
> >> > > > > > --
> >> > > > > > Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
> >> > > > > > To make changes to your subscription:
> >> > > > > > http://www.postgresql.org/mailpref/pgsql-jdbc



pgsql-jdbc by date:

Previous
From: Dave Cramer
Date:
Subject: Re: problem with LargeObject and commit
Next
From: Dave Cramer
Date:
Subject: Re: BUG org.postgresql.Driver.connect() distorts InterruptedException