I'm not quite sure, but I think I'm pretty careful of sharing objects
between threads.

1st, I only cached as few as possible orm objects.  I tried to detach
them, but I found that if I detach them,  I can't access any of their
fields any more.

2nd, I create new orm objects based on client request, pass them to
class Database and then merge them to scoped sessions, change, commit
and then discard these objects.

3rd, I switch to sqlite frequently to check if there is any database
operation outside Database, because sqlite doesn't allow multi-thread
access.

Actually it seems to work until 2 or 3 days ago suddenly cases hang
the server.

Ah, as I've already written lots of code in ORM, I think maybe I
should try to change Database to use a dedicated thread to handle all
database operations.

That might be a bottle neck of my application, but I really can't give
up orm as these mapper classes are used everywhere in my application.

On Mar 4, 7:26 pm, 一首诗 <newpt...@gmail.com> wrote:
> Hi, all
>
> I am using sqlalchemy in twisted in my project in the way below.
> Defer any database operation so the twisted's main thread won't be
> blocked.
>
> And I use scoped_session, so that sessions won't have to be created
> again and again.
>
> ======================================
> class Database()
>     def __init__(self, conn_str):
>         self.conn_str = conn_str
>         self.engine = create_engine(self.conn_str, echo=False)
>         self.Session = scoped_session(sessionmaker(bind = self.engine,
>              expire_on_commit=False))
>
>     def getObjectById(self, klass, id):
>         return threads.deferToThread(self._getObjectById, klass, id)
>
>     def _getObjectById(self, klass, id):
>         sess = self.Session()
>         return sess.query(klass).get(id)
> ======================================
>
> The code doesn't work.   When I limit the thread numbers to 1
>
>     reactor.suggestThreadPoolSize(1)
>
> Everything goes fine.  Other wise the server would be blocked and must
> be killed by "kill 9 ...".
>
> The result conflicts with my understanding of sqlalchemy.  Since I
> don't share any object between threads, there should be no problem!
>
> Ah....  It always have risk to use something you haven't tried
> before ....
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to