Saya telah membuat perpustakaan dengan Python yang berisi fungsi untuk mengakses database. Ini adalah pustaka pembungkus di sekitar basis data aplikasi pihak ketiga, ditulis karena fakta bahwa aplikasi pihak ketiga tidak menawarkan API yang layak. Sekarang saya awalnya membiarkan setiap fungsi membuka koneksi database selama durasi panggilan fungsi yang OK, sampai logika program saya menggunakan panggilan bersarang ke fungsi di mana saya kemudian akan memanggil fungsi tertentu beberapa ribu kali. Ini bukan sangat performant. Profiling ini menunjukkan bahwa overhead dalam pengaturan koneksi database - sekali per panggilan fungsi. Jadi saya memindahkan koneksi terbuka dari dalam fungsi ke modul itu sendiri, sehingga koneksi database akan dibuka ketika modul perpustakaan diimpor. Ini memberi saya kinerja yang dapat diterima.
Sekarang saya punya dua pertanyaan tentang ini. Pertama, apakah saya perlu khawatir bahwa saya tidak lagi secara eksplisit menutup koneksi database dan bagaimana saya bisa melakukannya secara eksplisit dengan pengaturan ini? Kedua, apakah yang telah saya lakukan berada di dekat bidang praktik yang baik dan bagaimana saya bisa mendekati ini?
openConn
fungsi dan buat pengguna meneruskannya ke setiap fungsi yang mereka sebut, dengan cara itu mereka dapat mengatur koneksi dalamwith
pernyataan atau apa punJawaban:
Ini sangat tergantung pada perpustakaan yang Anda gunakan. Beberapa dari mereka mungkin menutup koneksi sendiri (Catatan: Saya memeriksa perpustakaan sqlite3 builtin, dan itu tidak). Python akan memanggil destruktor ketika suatu objek keluar dari ruang lingkup, dan perpustakaan ini mungkin menerapkan destruktor yang menutup koneksi dengan anggun.
Namun, itu mungkin tidak terjadi! Saya akan merekomendasikan, seperti yang orang lain miliki di komentar, untuk membungkusnya dalam suatu objek.
Ini akan membuat koneksi database Anda di awal, dan menutupnya ketika tempat objek Anda dipakai keluar dari ruang lingkup. Catatan: Jika Anda instantiate objek ini di tingkat modul, itu akan bertahan untuk seluruh aplikasi Anda. Kecuali jika ini dimaksudkan, saya sarankan memisahkan fungsi basis data Anda dari fungsi non-basis data.
Untungnya, python telah menstandarkan API Database , jadi ini akan bekerja dengan semua DB yang sesuai untuk Anda :)
sumber
self
didef query(self,
?db.query('SELECT ...', var)
dan mengeluhkan perlunya argumen ketiga.MyDB
objek terlebih dahulu:db = MyDB(); db.query('select...', var)
ResourceWarning: unclosed <socket.socket...
saat menangani koneksi basis data ada dua hal yang harus diperhatikan:
mencegah beberapa koneksi instantiations, membiarkan setiap fungsi membuka koneksi database dianggap praktik buruk, memberikan jumlah terbatas sesi database, Anda akan kehabisan sesi; setidaknya solusi Anda tidak akan menurun, alih-alih, gunakan pola tunggal, kelas Anda akan dipakai hanya sekali, untuk informasi lebih lanjut tentang pola ini, lihat tautan
menutup koneksi saat keluar dari aplikasi, katakanlah Anda tidak melakukannya, dan bahwa Anda memiliki paling tidak selusin instance aplikasi yang melakukan hal yang sama, pada awalnya semuanya akan berjalan dengan baik, tetapi Anda akan kehabisan sesi basis data, dan satu-satunya perbaikan akan me-restart server database, yang bukan hal yang baik untuk aplikasi live karenanya gunakan koneksi yang sama bila memungkinkan.
untuk memperkuat semua konsep ini lihat contoh berikut yang membungkus psycopg2
sumber
if Database._instance is None: NameError: name 'Database' is not defined
. Saya tidak mengerti apaDatabase
itu dan bagaimana saya bisa memperbaikinya.Postgres.query(Postgres(), some_sql_query)
dalamwhile
lingkaran, akan tetap membuka dan menutup sambungan dalam setiap iterasi, atau tetap terbuka untuk seluruh waktu dariwhile
lingkaran sampai keluar program?query()
fungsi Anda , tetapi tampaknya ada masalah dengan kode saya ketika saya menjalankan aplikasi saya di "paralel". Saya membuat pertanyaan terpisah tentang hal itu: softwareengineering.stackexchange.com/questions/399582/…Akan menarik untuk menawarkan kemampuan manajer konteks untuk objek Anda. Ini berarti Anda dapat menulis kode seperti ini:
Ini akan menawarkan Anda cara praktis untuk menutup koneksi ke database secara otomatis dengan memanggil kelas menggunakan pernyataan with:
sumber
Waktu yang lama untuk memikirkan hal ini. Hari ini, saya menemukan jalannya. saya tidak tahu itu cara terbaik. Anda membuat file dengan nama: conn.py, dan menyimpannya di folder /usr/local/lib/python3.5/site-packages/conn/. Saya menggunakan freebsd dan ini adalah path folder situs-paket saya. di conn.py saya: conn = "dbname = omnivore user = postgres password = 12345678"
`` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ` dan dalam skrip saya ingin menelepon koneksi, saya menulis:
import psycopg2 import psycopg2.extras import psycopg2.extensions
dari conn import conn try: conn = psycopg2.connect (conn.conn) kecuali: halaman = "Tidak dapat mengakses database"
cur = conn.cursor ()
dan bla bla ....
semoga ini bermanfaat
sumber