I finally solved the problem.
I used to create a join in each request, where will produce this problem.
Now I create the join once and reuse in each request, everything is OK now.

And I do use a universal SqlSoup object.

----- Original Message ----- 
From: "Michael Bayer" <[email protected]>
To: <[email protected]>
Sent: Sunday, June 07, 2009 11:13 PM
Subject: [sqlalchemy] Re: something wrong about sqlsoup in mulithread request


> 
> that error looks like a collision in a very short section which only  
> occurs during mapper creation (i.e. weakref.iterkeys()) and should be  
> exceedingly difficult to reproduce, unless you are creating new  
> SqlSoup objects on each request.    Make sure you're using just one  
> SqlSoup object declared when your program first runs, so that it  
> creates a single set of mappers for the whole process, instead of new  
> mappers for every request.
> 
> OTOH if you are truly getting this collision with just a handful of  
> mappers in use throughout the app, we can place an additional lock  
> around the two unsynchronized references to _mapper_registry in  
> mapper.py.
> 
> 
> On Jun 7, 2009, at 6:41 AM, tsangpo wrote:
> 
>>
>> I use the SqlSoup to make it easy to access the database. It's all
>> right
>> when I make the http request one by one.
>> But it run into errors when serveral requests were sent at the same
>> time,
>> and fail to proccess requests anymore.
>> I log the Session, and found that each request exact has different
>> session.
>> The most strange thing is that each time the sqlsoup go down, it
>> produce
>> different error message:
>>
>> When everything is OK, the log is:
>> -------------------------------------------------------------------------------------
>> 2009-06-07 17:18:33,082 INFO sqlalchemy.engine.base.Engine.0x...a530
>> BEGIN
>> 2009-06-07 17:18:33,082 INFO sqlalchemy.engine.base.Engine.0x...a530
>> SELECT
>> user.id AS user_id, user.name AS user_name, user.full_name AS
>> user_full_name, user.password AS user_password, user.active AS
>> user_active
>> FROM user
>> WHERE user.password = %s AND user.name = %s
>> LIMIT 0, 1
>> 2009-06-07 17:18:33,082 INFO sqlalchemy.engine.base.Engine.0x...a530
>> ['123456', 'eric']
>> 2009-06-07 17:18:33,098 INFO sqlalchemy.engine.base.Engine.0x...a530
>> SELECT
>> role.id AS role_id, role.name AS role_name, role.description AS
>> role_description, rl_user_role.user_id AS rl_user_role_user_id,
>> rl_user_role.role_id AS rl_user_role_role_id, rl_role_action.role_id
>> AS
>> rl_role_action_role_id, rl_role_action.action_id AS
>> rl_role_action_action_id
>> FROM role INNER JOIN rl_user_role ON role.id = rl_user_role.role_id
>> INNER
>> JOIN rl_role_action ON role.id = rl_role_action.role_id
>> WHERE rl_role_action.action_id = %s AND rl_user_role.user_id = %s
>> 2009-06-07 17:18:33,098 INFO sqlalchemy.engine.base.Engine.0x...a530
>> [1L,
>> 1L]
>> 2009-06-07 17:18:33,098 INFO sqlalchemy.engine.base.Engine.0x...a530
>> SELECT
>> user.id AS user_id, user.name AS user_name, user.full_name AS
>> user_full_name, user.password AS user_password, user.active AS
>> user_active
>> FROM user
>> 2009-06-07 17:18:33,098 INFO sqlalchemy.engine.base.Engine.0x...a530
>> []
>> 2009-06-07 17:18:33,115 INFO sqlalchemy.engine.base.Engine.0x...a530
>> COMMIT
>> --------------------------------------------------------------------------------------
>>
>> And error edition 1:
>> -------------------------------------------------------------------------------------
>> Traceback (most recent call last):
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\google_appengine\google
>> \appengine\ext\webapp\__init__
>> .py", line 499, in __call__
>>    handler.get(*groups)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\database.py",
>> line
>> 44, in _func
>>    return func(*args, **kwargs)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 23, in action_metho
>> d
>>    if roles == 'everyone' or check_privilege(action_id,
>> users.get_current_user().id):
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 67, in check_privil
>> ege
>>    db.role.id==db.rl_user_role.role_id)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 541, in join
>>    return self.map(j)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 531, in map
>>    t = class_for_table(selectable, **kwargs)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 483, in class_for_table
>>    for k in mappr.iterate_properties:
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line
>> 777, in iterate_properties
>>    self.compile()
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line
>> 651, in compile
>>    for mapper in list(_mapper_registry):
>>  File "D:\CodingLife\win32\native\Python25\lib\weakref.py", line 303,
>> in
>> iterkeys
>>    for wr in self.data.iterkeys():
>> RuntimeError: dictionary changed size during iteration
>>
>> the request followed produce this:
>>
>> INFO:sqlalchemy.engine.base.Engine.0x...a530:ROLLBACK
>> ERROR:root:Traceback (most recent call last):
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\google_appengine\google
>> \appengine\ext\webapp\__init__.py",
>> line 499, in __call__
>>    handler.get(*groups)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\database.py",
>> line
>> 44, in _func
>>    return func(*args, **kwargs)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 23, in action_method
>>    if roles == 'everyone' or check_privilege(action_id,
>> users.get_current_user().id):
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 67, in check_privilege
>>    db.role.id==db.rl_user_role.role_id)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 541, in join
>>    return self.map(j)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 531, in map
>>    t = class_for_table(selectable, **kwargs)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 483, in class_for_table
>>    for k in mappr.iterate_properties:
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line 777, in iterate_properties
>>    self.compile()
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line 655, in compile
>>    "Message was: %s" % mapper._compile_failed)
>> InvalidRequestError: One or more mappers failed to compile.  Exception
>> was
>> probably suppressed within a hasattr() call. Message was: dictionary
>> changed
>> size during iteration
>> -------------------------------------------------------------------------------------
>>
>> And error edition 2:
>> -------------------------------------------------------------------------------------
>> ERROR:root:Traceback (most recent call last):
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\google_appengine\google
>> \appengine\ext\webapp\__init__.py",
>> line 499, in __call__
>>    handler.get(*groups)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\database.py",
>> line
>> 44, in _func
>>    return func(*args, **kwargs)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 23, in action_method
>>    if roles == 'everyone' or check_privilege(action_id,
>> users.get_current_user().id):
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 69, in check_privilege
>>    db.role.id==db.rl_role_action.role_id)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 541, in join
>>    return self.map(j)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 531, in map
>>    t = class_for_table(selectable, **kwargs)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 483, in class_for_table
>>    for k in mappr.iterate_properties:
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line 777, in iterate_properties
>>    self.compile()
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line 655, in compile
>>    "Message was: %s" % mapper._compile_failed)
>> InvalidRequestError: One or more mappers failed to compile.  Exception
>> was
>> probably suppressed within a hasattr() call. Message was: 'Mapper'
>> object
>> has no attribute 'primary_key'
>>
>> the request followed produce this:
>>
>> ERROR:root:Traceback (most recent call last):
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\google_appengine\google
>> \appengine\ext\webapp\__init__.py",
>> line 499, in __call__
>>    handler.get(*groups)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\database.py",
>> line
>> 44, in _func
>>    return func(*args, **kwargs)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 22, in action_method
>>    if ensure_login(handler):
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 33, in ensure_login
>>    user = check_user(username, password)
>>  File "D:\CodingLife\win32\home\workspace\eric\src\eric\auth
>> \__init__.py",
>> line 76, in check_user
>>    user = db.user.filter_by(name=username, password=password).first()
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\ext\sqlsoup.py",
>> line 410, in __getattr__
>>    return getattr(cls._query, attr)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\scoping.py",
>> line 107, in __get__
>>    mapper = class_mapper(owner)
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\util.py",
>> line 567, in class_mapper
>>    mapper = mapper.compile()
>>  File
>> "D:\CodingLife\win32\home\workspace\eric\lib\SQLAlchemy-0.5.3\lib
>> \sqlalchemy\orm\mapper.py",
>> line 655, in compile
>>    "Message was: %s" % mapper._compile_failed)
>> InvalidRequestError: One or more mappers failed to compile.  Exception
>> was
>> probably suppressed within a hasattr() call. Message was: One or more
>> mappers failed to compile.  Exception was probably suppressed within
>> a
>> hasattr() call. Message was: 'Mapper' object has no attribute
>> 'primary_key'
>> -------------------------------------------------------------------------------------
>>
>> >
> 
> 
> >
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to