Thanks. So the key point for me is to just use engine.dispose() (I
don't want to dig into gunicorn preload, this seems much cleaner).

About explicit manager: in practice it's as simple as
1. enabling it in models/__init__.py
2. using "with request.tm" everywhere instead of "with
transaction.manager", right?

> This is more likely to be an issue in web requests where your entire request 
> lifecycle is not actually protected by a transaction.

About your final sentence, I'm not sure I understand it. If I'm always
using request.dbsession, by definition I'm protected, to a request's
lifecycle am I not?

Zsolt

On 2 April 2018 at 21:47, Michael Merickel <mmeri...@gmail.com> wrote:
> The forking issue is likely because you're using a connection pool and so
> once a connection is opened at config-time, even though the session is
> properly closed the connection is just returned to the pool. The pool here
> is shared across the fork which is bad. The basic solution here is to add
> some sort of pre-fork hook that closes out every existing connection in the
> pool. I personally have not used forking wsgi servers in production and thus
> have not needed to deal with this problem but I'm pretty sure my advice hits
> at the core issue you're experiencing. Calling dispose() is one way to make
> sure that the underlying connection is closed which is why it's working for
> you. If I recall, gunicorn has some way to fork before config is called such
> that each subprocess is loaded independently which can help with this as
> well... If memory serves it was something like turning off the preloading
> feature.
>
> The explicit manager is about weeding out situations where you use a
> connection after it's closed [1]. Basically without it you could use
> something joined to the "tm" after the "with" block is done and you might
> not see an error. This is more likely to be an issue in web requests where
> your entire request lifecycle is not actually protected by a transaction.
>
> [1]
> https://docs.pylonsproject.org/projects/pyramid-tm/en/latest/#custom-transaction-managers
>
> On Mon, Apr 2, 2018 at 2:21 PM, Zsolt Ero <zsolt....@gmail.com> wrote:
>>
>> Michael, I've updated the code to your recommendation.
>>
>> https://github.com/hyperknot/pyramid_connections_bug
>>
>> It still requires the explicit engine.dispose() line, otherwise it
>> does bring the connection to the forked processes.
>>
>> This is with and without the explicit manager. What does the explicit
>> manager protect us from?
>>
>> Zsolt
>>
>>
>> On 2 April 2018 at 20:11, Michael Merickel <mmeri...@gmail.com> wrote:
>> > Using the pyramid-cookiecutter-alchemy setup you can access config data
>> > at
>> > config time using a pattern like this:
>> >
>> > from transaction import TransactionManager
>> >
>> > from myapp.models import get_tm_session
>> >
>> > def main(global_config, **settings):
>> >     config = Configurator(settings=settings)
>> >     config.include('myapp.models')
>> >
>> >     tm = TransactionManager(explicit=True)
>> >     with tm:
>> >         dbsession = get_tm_session(config.registry['dbsession_factory'],
>> > tm)
>> >         ...  # do queries and stuff
>> >
>> >     return config.make_wsgi_app()
>> >
>> > This will properly handle the lifecycle of a session for you, same as
>> > when
>> > serving a request. Be sure if you keep any objects around that you
>> > expunge
>> > them from the session and re-attach/merge them into any session where
>> > you
>> > use them.. ORM objects are only valid on the dbsession they were loaded
>> > from.
>> >
>> > - Michael
>> >
>> >
>> > On Mon, Apr 2, 2018 at 11:59 AM, Zsolt Ero <zsolt....@gmail.com> wrote:
>> >>
>> >> OK, I agree with that. Still, storing config values in the database is
>> >> a common pattern for medium to large web apps, so it at least makes
>> >> sense to have some kind of resource about how to do it. I hope that if
>> >> nothing else at least this thread will be useful for someone in the
>> >> future.
>> >>
>> >> --
>> >> You received this message because you are subscribed to the Google
>> >> Groups
>> >> "pylons-discuss" group.
>> >> To unsubscribe from this group and stop receiving emails from it, send
>> >> an
>> >> email to pylons-discuss+unsubscr...@googlegroups.com.
>> >> To post to this group, send email to pylons-discuss@googlegroups.com.
>> >> To view this discussion on the web visit
>> >>
>> >> https://groups.google.com/d/msgid/pylons-discuss/CAKw-smBuH5hKGpNgs-6dYkNiAU%3DGGUUOF7aLHAzHe0AE25T7qg%40mail.gmail.com.
>> >> For more options, visit https://groups.google.com/d/optout.
>> >
>> >
>> > --
>> > You received this message because you are subscribed to a topic in the
>> > Google Groups "pylons-discuss" group.
>> > To unsubscribe from this topic, visit
>> >
>> > https://groups.google.com/d/topic/pylons-discuss/_MJflNUcjdg/unsubscribe.
>> > To unsubscribe from this group and all its topics, send an email to
>> > pylons-discuss+unsubscr...@googlegroups.com.
>> > To post to this group, send email to pylons-discuss@googlegroups.com.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/pylons-discuss/CAKdhhwGoPbgM7gDWBLxdanT%3DhcJQR8sT01E2xwWFxw1zxpCD1A%40mail.gmail.com.
>> >
>> > For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "pylons-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to pylons-discuss+unsubscr...@googlegroups.com.
>> To post to this group, send email to pylons-discuss@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/pylons-discuss/CAKw-smBMmRqu2ZTPSp%3Djh%2BY0RriEwvxgdYQnwq--k4abeUkd-g%40mail.gmail.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "pylons-discuss" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/pylons-discuss/_MJflNUcjdg/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> pylons-discuss+unsubscr...@googlegroups.com.
> To post to this group, send email to pylons-discuss@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pylons-discuss/CAKdhhwGFjP7-aYzz4NEewWv1kdbMxhH25hrX4JC3oR4ZizqYeg%40mail.gmail.com.
>
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pylons-discuss+unsubscr...@googlegroups.com.
To post to this group, send email to pylons-discuss@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pylons-discuss/CAKw-smDuP2324T0GLi-J83UH-a5mVVvtPC3HyUAgB65aRSGQ5Q%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to