On Sep 29, 2008, at 9:30 AM, Alex K wrote:

>
> Hi All,
>
> My application uses XML schema to load tables, classes, set SQLA
> mapping and relations.
>
> Each processing node (thread or process, depends on config) does not
> know beforehand what type of mapping it will process, that's why I
> need to create mapping (parse schema, and generate classes) per each
> request.
>
> This approach worked fine for me, however  I have issues when there is
> high load on the same processing node - SQLA throws an exception
> saying that my dynamic class is not mapped. ("Class app.User is not
> mapped")
>
> I understand that it may be some app/configuration issue (and I'm
> almost sure it is).
>
> Docs say that mapping should be created only at the app level, I
> thought that violating this rule can cause errors of this kind.

OK, what we mean more specifically there is that the mapper is created  
in the same scope as the class.  If you are creating classes local to  
a function, you can create the mapper there as well.

That you have issues during "high load" is suspect, however.

> I thought that clear_mappers can help here, but I fear it will clear
> all mappers in the process,  since _mapper_registry is a module level
> global hash.

this is correct.   I wouldn't use clear_mappers here.     If your  
classes fall out of scope and are garbage collected, the corresponding  
mappings should also fall out of scope, *provided no remaining mappers  
reference them*.   This behavior is also tested more fully in 0.5 and  
I can't guarantee the "automatic garbage collection" as strongly in 0.4.

The overall idea of removing partial sets of mapped classes from a  
larger group is not something we've tested or tried to support.    It  
wont work, for example, if you leave a mapper in place which is parent  
mapper of one of the removed mappers, or if the remaining mapper has  
relations to the removed mapper.   The results are not defined in  
those cases.

Another nasty side effect is that the "compile" phase of mappers is  
globally mutexed.   If you're creating mappings per request, the  
compilation stage is mutexted against all other requests.   This is  
all a product of the fact that mappings deal with a global registry.   
Additionally, since mapper compilation is only meant to occur once per  
application, its not at all optimized for per-request performance and  
will make for a slightly more sluggish application if called constantly.

It wouldn't be very difficult for the ORM to work using a Pylons-like  
"stacked object proxy" approach where the mapper registry and its  
mutex are swapped in and out on a per-request basis but its not clear  
right now that this is something that should be built in.

The most unclear aspect of this, to me, is why you need to "drop"  
anything at all.   It seems that the incoming XML schema defines a set  
of tables to be worked with.   Certainly, the number of tables which  
an instance of your application uses is fixed.    It seems like it  
would be very easy to just check the XML schema's identifier and look  
up in a dictionary that this set of mappings has already been  
defined.   You'd have none of the issues related to clearing partial  
mappings and you wouldn't have the enormous overhead of parsing  
schemas and recompiling a set of mappers on every request.







--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to