Hi, Thanks for your reply. I'm using it the way like you. The only difference is that I am using pyamf instead of PB.
On every request, I delegate required db operations to a class called Database, similar to these code below. I used to use scope_session instead of create and close session every time. But as I said in my earlier mails, they don't work. These code below seems to work right now. But if you have more suggestion, I will be very thankful. #========================================= def require_session(f): '''create and close session for each synchronous method''' def wrapper(model, *args, **kw): sess = model.Session() try: return f(model, sess, *args, **kw) finally: sess.close() return wrapper class Database() def __init__(self, conn_str): self.conn_str = conn_str self.engine = create_engine(self.conn_str, echo=False) self.Session = sessionmaker(bind = self.engine, expire_on_commit=False) def getObjectById(self, klass, id): return threads.deferToThread(self._getObjectById, klass, id) @require_session def _getObjectById(self, sess, klass, id): return sess.query(klass).get(id) #========================================= On Mar 6, 5:44 am, Jeff FW <jeff...@gmail.com> wrote: > Don't use scoped_session--you'll run into problems no matter what you > do. I'm using Perspective Broker from Twisted with SQLAlchemy. I > make sure to create and commit/rollback a session for *every* PB > request. It works perfectly, and that's the only way I was really > able to get it to work in all cases. > > Assuming you're using Twisted in a similar way, you could write a > simple decorator to wrap any functions that need a database session in > the begin/commit stuff as necessary. > > If you can give more details of how you're using Twisted, I might be > able to offer some more insight. > > -Jeff > > On Mar 5, 12:33 am, 一首诗 <newpt...@gmail.com> wrote: > > > 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 -~----------~----~----~----~------~----~------~--~---