Thank you Simon for your informative reply! It's very information-rich and
give me a new perspective to reflect on my design.
It's really lucky for me to join this forum, I've been getting all such
bonus knowledge all along!:)


On Mon, Jul 14, 2014 at 5:48 AM, Simon King <si...@simonking.org.uk> wrote:

> I wouldn't say that you are violating a fundamental principle, I would
> just say that what you are suggesting isn't the "normal" structure of
> a web application.
>
> (Not that there is a "normal" structure for web applications really -
> it massively depends on the size of your audience. Something that
> works for a single user or a small number of users would be
> inappropriate for an application with vast numbers of users)
>
> If your web application keeps "application state" in its own process
> between requests, then you need to think very carefully about race
> conditions. For example, does your web application framework use
> threads? What happens if 2 requests try to operate on the same person
> at the same time?
>
> It also constrains your architecture if you want to "scale up". If a
> web request loads the information it needs from the database,
> processes it, then flushes it back, then you can add multiple web
> frontend processes all talking to the same backend database. When a
> client makes an HTTP request, it doesn't matter which frontend handles
> that request, because all the state is in the database.
>
> Also, web requests tend to map quite nicely onto database
> transactions, which themselves are meant to be short lived. A
> long-lived database transaction has the potential to lock parts of the
> database, or at least increase the amount of accounting that the
> database has to do.
>
> It's possible that none of this matters for your application. If you
> only have a single user, the chance of threads clashing is fairly
> small. If you've come up with a solution that works for you, carry on
> :-)
>
> Hope that helps,
>
> Simon
>
> On Mon, Jul 14, 2014 at 12:07 PM, Bao Niu <niuba...@gmail.com> wrote:
> > Thank you guys for your replies. These days I spent some time reading the
> > documentation on session to make sure I understand all the basics. After
> > reading, I still have trouble understanding the point that mapped objects
> > should not outlive the session from which they are originally queried.
> >
> > In my case, a Person object loaded from database, having two attributes,
> > o.FirstName, and o.LastName, is expected to persist within the full
> > life-cycle of my application, not just a database session, because when
> you
> > query the object you just make it visible to the application, you are not
> > sure what you are going to flush into database at this moment. As
> Jonathan
> > pointed out, "merging" seems to be the only way to extend the lifespan of
> > those queried and mapped objects across different sessions.
> >
> > What I suggested in my previous post is having two (series of) sessions,
> one
> > is responsible for querying and making FirstName(s) and LastName(s), and
> > possibly concatenating the two; while the other (series of) sessions is
> > responsible for holding all the Persons objects together and do some
> further
> > query on them.
> >
> > Why is this design flawed?? Did I violate some fundamental principles
> here?
> > Thanks.
> >
> >
> > On Tue, Jul 1, 2014 at 8:24 AM, Jonathan Vanasco <jonat...@findmeon.com>
> > wrote:
> >>
> >> That design is definitely flawed.
> >>
> >> Read up on the ORM session documentation, and pay attention to
> "Merging",
> >>
> >> The session encapsulates a bit of logic and a unit of work.  Once you
> >> close a session, the objects within it are considered to be
> out-of-phase.
> >> Accessing their attributes -- even only for a read -- requires a new
> >> database session/transaction to ensure that the data is the same.
> >>
> >> Sessions should generally last the length of a web request -- unless you
> >> have very specific business requirements that necessitate otherwise.  In
> >> your case, you don't.  Just start a session at the beginning of each
> >> request.  You'll overcomplicate everything otherwise.
> >>
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/CVIkd-WQiDM/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to