z3c.saconfig engine creation configuration
On MySQL, it's necessary to supply to ``pool_recycle`` parameter on engine creation, else the connection dies after some timeout and the pool is unable to hand out a session. The result of this is that the first request fails whenever the connection has been dropped. Attached is a patch that allows supplying these pool-related configuration options directly in the ZCML directive (db:engine). \malthe Index: src/z3c/saconfig/zcml.py =================================================================== --- src/z3c/saconfig/zcml.py (revision 101264) +++ src/z3c/saconfig/zcml.py (working copy) @@ -27,13 +27,31 @@ required=False, default=False) + pool_size = zope.schema.Integer( + title=u"Pool size", + description=u"Number of connections to keep open inside the connection pool.", + required=False, + default=5) + + pool_recycle = zope.schema.Integer( + title=u"Pool recycle", + description=u"Recycle connections after the given number of seconds have passed.", + required=False, + default=-1) + + pool_timeout = zope.schema.Integer( + title=u"Pool timeout", + description=u"Number of seconds to wait before giving up on getting a connection from the pool.", + required=False, + default=30) + setup = zope.schema.BytesLine( title=u'After engine creation hook', description=u'Callback for creating mappers etc. One argument is passed, the engine', required=False, default=None) + - class ISessionDirective(zope.interface.Interface): """Registers a database scoped session""" @@ -62,8 +80,11 @@ default="z3c.saconfig.utility.GloballyScopedSession") -def engine(_context, url, name=u"", echo=False, setup=None, twophase=False): - factory = utility.EngineFactory(url, echo=echo) +def engine(_context, url, name=u"", echo=False, setup=None, twophase=False, + pool_size=5, pool_recycle=-1, pool_timeout=30): + factory = utility.EngineFactory( + url, echo=echo, pool_size=pool_size, + pool_recycle=pool_recycle, pool_timeout=pool_timeout) zope.component.zcml.utility( _context,
Malthe Borch wrote:
On MySQL, it's necessary to supply to ``pool_recycle`` parameter on engine creation, else the connection dies after some timeout and the pool is unable to hand out a session.
The result of this is that the first request fails whenever the connection has been dropped.
Attached is a patch that allows supplying these pool-related configuration options directly in the ZCML directive (db:engine).
\malthe
I would rather we did not hardcode the defaults from SQLAlchemy into the engine directive (I guess they could change in future). Instead use a default of None and only supply the parameter if the config option is set. Laurence
Laurence Rowe wrote:
I would rather we did not hardcode the defaults from SQLAlchemy into the engine directive (I guess they could change in future). Instead use a default of None and only supply the parameter if the config option is set.
Sounds right to me. Attached is an update patch. \malthe Index: src/z3c/saconfig/zcml.py =================================================================== --- src/z3c/saconfig/zcml.py (revision 101264) +++ src/z3c/saconfig/zcml.py (working copy) @@ -27,13 +27,28 @@ required=False, default=False) + pool_size = zope.schema.Int( + title=u"Pool size", + description=u"Number of connections to keep open inside the connection pool.", + required=False) + + pool_recycle = zope.schema.Int( + title=u"Pool recycle", + description=u"Recycle connections after the given number of seconds have passed.", + required=False) + + pool_timeout = zope.schema.Int( + title=u"Pool timeout", + description=u"Number of seconds to wait before giving up on getting a connection from the pool.", + required=False) + setup = zope.schema.BytesLine( title=u'After engine creation hook', description=u'Callback for creating mappers etc. One argument is passed, the engine', required=False, default=None) + - class ISessionDirective(zope.interface.Interface): """Registers a database scoped session""" @@ -62,16 +77,27 @@ default="z3c.saconfig.utility.GloballyScopedSession") -def engine(_context, url, name=u"", echo=False, setup=None, twophase=False): - factory = utility.EngineFactory(url, echo=echo) - +def engine(_context, url, name=u"", echo=False, setup=None, twophase=False, + pool_size=None, pool_recycle=None, pool_timeout=None): + # to avoid overriding defaults, we only provide pool configuration + # parameters if set + kwargs = {} + if pool_size is not None: + kwargs['pool_size'] = pool_size + if pool_recycle is not None: + kwargs['pool_recycle'] = pool_recycle + if pool_timeout is not None: + kwargs['pool_timeout'] = pool_timeout + + factory = utility.EngineFactory(url, echo=echo, **kwargs) + zope.component.zcml.utility( _context, provides=interfaces.IEngineFactory, component=factory, permission=zope.component.zcml.PublicPermission, name=name) - + if setup: if _context.package is None: callback = resolve(setup)
participants (2)
-
Laurence Rowe -
Malthe Borch