3

Pyramid フレームワークでアプリを構築しており、web2py-DAL を使用したいと考えています。Firebird-embedded は最適なデータベースです。

1 つの Web ページから複数のビューを非同期的に呼び出そうとするまでは、うまく機能します。「無効なカーソル状態」、「無効なカーソル参照」、または「閉じたカーソルを再度閉じようとしている」などのさまざまなエラーが kinterbasdb ドライバーから発生します。そこでは、sqlite がエラー メッセージなしで単に故障し、Python が使用されます。これらのビュー callable は、SELECT による単純な読み取り以外は何もしていません。

これは、ピラミッド ルート ファクトリが各リクエストで同じ DAL オブジェクトを返す場合に発生します。異なるリクエストからのスレッドが同じカーソルオブジェクトで動作しているように見えるため、他のスレッドがカーソルがここにあると想定している間、カーソルは閉じられます。

各リクエストで新しい DAL オブジェクトを作成すると、別の問題が発生します。各リクエストの新しい接続ごとにメモリが割り当てられ、このメモリは解放されません。そのため、いくつかの docents リクエストの後、数百 MB の無駄なメモリが発生します。

残念ながら、Sqlalchemy はこのプロジェクトのオプションではありません。

何かアイデアはありますか?

4

2 に答える 2

2

ポイントは、リクエストごとに DAL オブジェクトを作成する必要があるということでした。ただし、その後は手動で閉じる必要があります。

私はそのようにしました:

request.add_finished_callback

request オブジェクトのプロパティなので、その方法で DAL オブジェクトを拡張しました。

class Root(DAL):
    def __init__(self, request, uri):
        DAL.__init__(self, uri, pool_size=0)
        request.add_finished_callback(self._close)

    def _close(self, request):
        self._adapter.close_all_instances('commit')

その後、リクエストごとに root_factory によって新しいルート オブジェクトが返されます。

web2py-usersグループに感謝します!

于 2011-04-06T18:09:26.763 に答える
1

web2pyメーリングリストからのいくつかのソリューション。

于 2011-04-06T12:18:22.060 に答える