[Seaside] Re: Application/Session Objects

Richard Huxton dev at archonet.com
Wed Feb 22 19:10:55 UTC 2006


Yanni Chiu wrote:
> Richard Huxton wrote:
>> Hmm - that's useful, but what if I want to re-use the connection after 
>> the request?
> 
> I'm not sure I understand you. The connection is still open,
> and would be reachable via the session. Note that a WASession is
> longer lived than a single http request/response cycle.

Exactly - my database connection is sat there idle while the user reads 
the page and decides what to click on. Now sometimes I'm going to want 
the same connection over multiple requests, but most of the time I don't 
care. What I don't want to do is reconnect every time, hence the pool. I 
also don't necessarily want one DB connection for every possibly active 
session and it doesn't seem worth using pgpool when I've already got 
persistence.

>  > That is, I'd like to be able to do:
>> 1. hook a request start, claim a DB connection from the pool
>> 2. do some database queries
>> 3. hook the request end, return connection to the pool
>>
>> Crucially, #3 might restrict that connection for this session only or 
>> allow any session to re-use it.
> 
> Currently, for postgres, I connect with fixed (by configuration)
> username/password. Then, on the connection, I send:
> 
>   SET SESSION AUTHORIZATION username
> 
> But I'm not entirely sure this the "right" thing, since I've
> not fully tested things with multiple users.

That's what I'm planning, but in 8.1 with "SET ROLE username". With the 
optional wrinkle perhaps of connecting to the database as a NORMAL or 
SYSADMIN role at startup - safety in depth.

>> I'd hate to have an open transaction floating around for an hour while 
>> I wait for the session to expire.
> 
> Why would a transaction be open, unless you designed your
> application flow in that way.

Because mistakes happen, and one of the advantages of having this simple 
persistence of state is that I can start to span a transaction over 
multiple request/response if desirable.

 > Normally, you'd accumulated
> user responses in your application model, through multiple
> interactions with the user. Then when they hit "Save", the
> transaction would be started, the database changes sent,
> and the transaction commited.

And if I've been clumsy enough to have a stray BEGIN then I can end up 
blocking other transactions until the session expires. However, if I can 
attach to the end-of-request-response point in the code then I can issue 
a ROLLBACK and pretty quickly spot if I've made a mistake. I can also 
return the connection to the pool if I don't need it and use it for the 
next request to come in without the overhead of reconnecting/having lots 
of idle connections.

-- 
   Richard Huxton
   Archonet Ltd


More information about the Seaside mailing list