2009-07-13 5 views

Répondre

3

OCI (interface client Oracle) a un paramètre OCI_THREADED qui a pour effet que les connexions sont mutexées, de sorte que l'accès simultané via plusieurs threads est sûr. C'est probablement le réglage auquel le document que vous avez vu faisait référence.

cx_oracle, qui est essentiellement un pont Python-> OCI, donne accès à ce paramètre dans sa fonction de connexion en utilisant le mot clé argument "threaded", décrit au http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect. Les docs déclarent qu'elle est fausse par défaut car elle entraîne une "pénalité de performance de 10 à 15%", bien qu'aucune source ne soit donnée pour cette information (et les statistiques de performance doivent toujours être considérées de manière suspecte comme une règle).

En ce qui concerne SQLAlchemy, le dialecte cx_oracle fourni avec SQLAlchemy définit cette valeur à True par défaut, avec l'option de la redéfinir sur False lors de la configuration du moteur via create_engine() - donc à ce niveau, il n'y a pas de problème. Mais au-delà de cela, les modèles d'utilisation recommandés par SQLAlchemy (à savoir une session par thread, gardant les connexions locales à un pool où ils sont extraits par une fonction) empêchent l'accès simultané à une connexion. Vous pouvez donc probablement désactiver le paramètre "threaded" sur create_engine() et profiter des augmentations de performances possibles, à condition que les modes d'utilisation habituels soient respectés.

1

Tant que chaque thread concurrent a sa propre session, tout devrait bien se passer. Essayer d'utiliser une session partagée est l'endroit où vous aurez des ennuis.

+0

tks, puisque le document officiel de l'oracle dit que vous devez activer quelque chose (ne savez pas ce que "quelque chose" est encore ...) pour que l'oracle utilise la capacité parallèle .. Que dois-je faire dans sqlalchemy? – Ryan