Hello there. I'm using SQLAlchemy 0.7.10 with postgres+pgbouncer, and
I'm trying to move from a transaction-mode pool towards a
statement-mode pool.

The reason for this move, is that I've got quite a high volume of
reads that cannot be quickly serviced in transaction mode, since many
connections are left idling in a transaction for perhaps up to 1
second. A combination of network roundtrips and GIL-related delays
conspire to get me into this position.

So, I've been refactoring my application so that I can use two kinds
of sessions, read-write normal transactional ones, and read-only ones
that use autocommit and a different pgbouncer configured for statement
pooling.

Problem I run into, is that even in autocommit mode, SQLAlchemy itself
issues multi-statement transactions, like this:

>>> s = get_slave_session(autocommit=True)
>>> c = s.connection()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/jampp/analytics/matlogbrowser/model/base.py", line 80, in
connection
    return sqlalchemy.orm.Session.connection(self, *p, **kw)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/session.py", line
784, in connection
  File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/session.py", line
788, in _connection_for_bind
  File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/session.py", line
313, in _connection_for_bind
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line
2489, in contextual_connect
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 236, in connect
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 401, in __init__
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 746, in _do_get
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 189, in
_create_connection
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 287, in __init__
  File "build/bdist.linux-x86_64/egg/sqlalchemy/event.py", line 380,
in exec_once
  File "build/bdist.linux-x86_64/egg/sqlalchemy/event.py", line 389, in __call__
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/strategies.py",
line 167, in first_connect
  File "build/bdist.linux-x86_64/egg/sqlalchemy/dialects/postgresql/base.py",
line 1000, in initialize
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py",
line 171, in initialize
  File "build/bdist.linux-x86_64/egg/sqlalchemy/dialects/postgresql/base.py",
line 1184, in _get_server_version_info
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line
1449, in execute
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line
1628, in _execute_text
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line
1698, in _execute_context
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line
1691, in _execute_context
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py",
line 331, in do_execute
sqlalchemy.exc.DatabaseError: (DatabaseError) Long transactions not allowed
ERROR:  Long transactions not allowed
 'select version()' {}


Here, get_slave_session returns a subclass of Session that will
override connection() to return a connection that has
execution_options(autocommit=True) applied (because for pgbouncer,
even the implicit transaction for selects is a transaction). The
session itself is also built with a autocommit=True.

Now, it seems the session is using a connection that is indepepndent
of what connection() returns. What do I have to override to get the
desired behavior? (that is: one query per transaction no matter which
type of query).

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to