Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。質問をした時に、下記のコメントをいただきました。3.xからSQLite3を呼び出した後にクローズ処理は必ず行うべきものでしょうか。クローズ処理を行う場合、どのコードが推奨されるでしょうか。c:無学ゆえにコメントをいただくまでcontextlib.closingの存在を知りませんでした。日本語でsqlite3のサンプルコードを見ても、closingを使わずにwithのみが書かれているものや、finallyブロックを使わずに正常処理としてclose()を行うもの、close()しないものが多く見つかります。本家SOの類似質問への回答では、下記について言及するとともにcontextlib.closingの使用を推奨しています。managerのようにsqlite3のconnectionを返す。)だかしかし、connection.__exit__()関数は接続を切断しない。これはブロックの処理を正常に実行したらコミットし、例外が発生したら破棄する。本家SOの別質問では、「クローズした方が良いんじゃない?」程度に軽く推奨しているように読み取れます。クローズすることで利用者にはどのようなメリットがあるのでしょうか。withを使いclosingを使わない下記のスクリプトを並列処理しても、ロックはかからずに正常終了しました。下記は複数ユーザが個別のプログラムで1つのデータベースファイルに同時アクセスする状況を再現する状況を、並列処理で強引に再現しようとしています。#同時アクセスのために効率の悪い並列処理を行っています。このコードを再利用する際にはベストアンサーもご参照願います。sqlite3.connect()について以下のようにように説明されています。データベースはそのトランザクションがコミットされるまでロックされます。パラメータで、例外を送出するまで接続がロックが解除されるのをどれだけ待つかを決めます。したがって、接続を閉じずにどんどん作っていってもすぐに問題が発生することはなく、メモリーを無駄に消費してしまうという問題だけです。今回のサンプルプログラムでは、100個の接続を作って終了してしまうプログラムなので問題が発生することはないと思われます。メモリーを浪費することはいいことでなく、特にエンタープライ系の場合はこういうことがバグの要因になりやすいので厳しい意見になります。言えば、毎回接続を作ること自体が無駄です。今回のサンプルプログラムであれば、変更を加えることができる接続は1つだけなので並列処理を使わずに単純に次のようにした方が処理が速いはずです。Poolingがよく使われます。Webでは、bottleであれば、bottle-sqlalchemy、flaskであれば、flask-sqlalchemyという専用のパッケージを使います。最後になりましたが、接続を閉じる処理に関しては、contextlib.closingとtry-finallyは同じことです。contextlib.closingの方が短く書けるのでそちらを使えばいいのではないですか。withのみでは、commitをするだけで接続は閉じません。個の銅バッジ散らかった質問に真似しない方が良いコードも記述してしまい申し訳ありません。コードのコメント等を追記して初学者のコピペによる悪影響が出ないよう留意いたします。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。