Apakah saya perlu menutup koneksi mysql?

❮ Referensi PHP MySQLi

Contoh - Gaya Berorientasi Objek

Tutup koneksi database yang dibuka sebelumnya

$mysqli = new mysqli("localhost","my_user","my_password","my_db");

if ($mysqli -> connect_errno) {
echo "Gagal terhubung ke MySQL. ". $mysqli -> connect_error;
KELUAR();
}

//. beberapa kode PHP

$mysqli -> tutup();
?>


Lihatlah contoh gaya prosedural di bagian bawah


Definisi dan Penggunaan

Fungsi close() / mysqli_close() menutup koneksi database yang dibuka sebelumnya


Sintaksis

Gaya berorientasi objek

Gaya prosedural

Nilai Parameter

ParameterDeskripsikoneksiDiperlukan. Menentukan koneksi MySQL untuk ditutup

Detail Teknis

Nilai Pengembalian. BENAR pada kesuksesan. SALAH pada kegagalan Versi PHP. 5+

Contoh - Gaya prosedural

Tutup koneksi database yang dibuka sebelumnya

$con=mysqli_connect("localhost","my_user","my_password","my_db");

jika (mysqli_connect_errno()) {
echo "Gagal terhubung ke MySQL. ". mysqli_connect_error();
KELUAR;
}

//. beberapa kode PHP

mysqli_close($kon);
?>



❮ Referensi PHP MySQLi

Be careful when using multiple links to connect to same database (with same username). Unless you specify explicitly in mysql_connect() to create a new link, it will return an already open link. If that would be closed by mysql_close(), it will also (obviously) close the other connection, since the link is the same.
Had lot of trouble figuring it out, since in <=4.3.6 there was a bug which didn't close the connection, but after the patch to >=4.3.7, all my application broke down because of a single script that did this.

Tidak. Jangan menutup koneksi sama sekali. Biarkan PHP melakukannya untuk Anda. Apa yang terjadi jika Anda perlu mengambil lebih banyak data? . Sebaiknya biarkan koneksi tetap terbuka dan lakukan semua yang Anda butuhkan atau inginkan. Biarkan PHP menutupnya sendiri dan selesai dengan itu. Anda membuang waktu dan sumber daya setiap kali membuka dan menutup koneksi hanya untuk melakukan kueri umum sederhana

Itulah tepatnya yang telah saya lakukan selama bertahun-tahun. Saya membuka koneksi menjalankan kueri dan membiarkan eksekusi skrip berakhir dan menutup koneksi. Kami baru saja berdiskusi hari ini dengan rekan-rekan saya tentang hal ini. Mereka mengatakan bahwa Anda harus menutup koneksi sebelum skrip selalu berakhir saat Anda tidak perlu menjalankan kueri lagi. Juga contoh manual PHP sepertinya menyarankan untuk menutup koneksi

Dan ketika saya mengatakan "tutup koneksi", saya tidak bermaksud Anda membuka-menutup dan membuka kembali-menutup koneksi lagi untuk permintaan berikutnya. Apa yang akan saya lakukan jika saya menutup koneksi adalah saya menjalankan semua kueri terlebih dahulu, menutup koneksi, lalu memproses data yang dikembalikan dari kueri. Jadi hanya akan ada satu siklus koneksi buka-tutup

Biasanya eksekusi skrip tidak memakan banyak waktu. Bayangkan kita memiliki skenario di mana kita harus menjalankan banyak skrip di cron yang memakan waktu lama. Semua pekerjaan cron ini akan mencadangkan koneksi untuk jangka waktu tertentu. Kemudian selain itu jika kita memiliki volume besar pengguna simultan menggunakan kumpulan koneksi yang sama. Ini memungkinkan koneksi maksimal melebihi dan beberapa pengguna tidak dapat menggunakan layanan ini

Ada solusi untuk itu juga, naikkan saja batas koneksi maksimal, yang sebaliknya membutuhkan lebih banyak sumber daya. Dan pendapat saya adalah bahwa sumber daya tidak mahal hari ini. Sangat mudah dan murah untuk menambahkan lebih banyak pemrosesan perangkat keras pada VM saat ini

Saya membuka topik untuk mendengar pendapat dan kebiasaan rekan komunitas lainnya bagaimana Anda menangani koneksi basis data saat Anda membuat kode. Saya juga mencoba google dan pendapatnya cukup terbagi. Beberapa orang suka menutup koneksi secara ketat sebelum eksekusi skrip berakhir dan beberapa orang hanya mengatakan untuk membiarkan skrip melakukannya pada akhirnya

Saya sedang membangun API dengan labu untuk menghubungkan MySQL. Apakah saya perlu menutup database setiap kali ada permintaan?

@app.route('/Kj', methods=['GET'])
def ABC():
    db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
    curs = db.cursor()
    try:
        curs.execute("SELECT * FROM KJ")
        a = curs.fetchall()
    except Exception:
        return 'Error: unable to fetch items'
    return jsonify({'Stock': a})

Apakah saya perlu menutup koneksi mysql?
vinasia. 157 posting. Jan. 4, 2017, 9. 10 pagi. m. .

Hai Glenn,

Apakah kode di atas akan bekerja sebaik sqlalchemy? . Saya masih menggali sqlalchemy untuk memahami session. tutup() dan koneksi tutup

@app.route('/Kj', methods=['GET'])
        def ABC():
            db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
            curs = db.cursor()
            try:
                curs.execute("SELECT * FROM KJ")
                a = curs.fetchall()
                curs.close()
            except Exception:
                return 'Error: unable to fetch items'
                curs.close()
            finally:
                 curs.close()
            return jsonify({'Stock': a})
_

Apakah saya perlu menutup koneksi mysql?
vinasia. 157 posting. Jan. 7, 2017, 8. 30 pagi. m. .

Hai Glenn, Bagaimana saran Anda? . Apakah ini dapat menangani lalu lintas tinggi?

@app.route('/Kj', methods=['GET'])
        def ABC():
            db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
            curs = db.cursor()
            try:
                curs.execute("SELECT * FROM KJ")
                a = curs.fetchall()
             except Exception:
                return 'Error: unable to fetch items'

            finally:
                 curs.close()
                 db.close()
            return jsonify({'Stock': a})
_

Juga, dibutuhkan 0. 28 detik dari awal hingga menutup database. Apakah ini berarti satu koneksi dapat mendukung 3 akses per detik dan sekitar 9 akses per detik untuk akun gratis?

Apakah saya perlu menutup koneksi mysql?
vinasia. 157 posting. Jan. 7, 2017, 1. 49 hal. m. .

Hanya menjawab atas nama Glenn -- jika Anda menggunakan SQLAlchemy, maka Anda tidak akan membuka dan menutup koneksi basis data pada setiap pukulan, karena itu akan menangani koneksi Anda untuk Anda dan membuatnya tetap hidup di antara pukulan jika bisa. Membuka dan menutup koneksi DB adalah operasi yang relatif mahal, dan membutuhkan waktu. Jadi, jika Anda tidak perlu melakukan itu, situs web Anda tidak terlalu memproses setiap permintaan, yang berarti situs web Anda mungkin dapat menangani lebih banyak klik

Saya mengatakan "mungkin" karena jika situs web Anda melakukan banyak hal selain hal koneksi database, maka hal itu mungkin hanya sebagian kecil dari pekerjaan yang dilakukannya, jadi percepatannya mungkin tidak besar. Dengan kata lain, jika

@app.route('/Kj', methods=['GET'])
        def ABC():
            db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
            curs = db.cursor()
            try:
                curs.execute("SELECT * FROM KJ")
                a = curs.fetchall()
                curs.close()
            except Exception:
                return 'Error: unable to fetch items'
                curs.close()
            finally:
                 curs.close()
            return jsonify({'Stock': a})
_2 berjalan cepat, maka overhead koneksi akan menjadi bagian besar dari waktu pemrosesan Anda saat ini, sehingga SQLAlchemy akan mempercepat secara signifikan. Tetapi jika
@app.route('/Kj', methods=['GET'])
        def ABC():
            db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
            curs = db.cursor()
            try:
                curs.execute("SELECT * FROM KJ")
                a = curs.fetchall()
                curs.close()
            except Exception:
                return 'Error: unable to fetch items'
                curs.close()
            finally:
                 curs.close()
            return jsonify({'Stock': a})
_2 berjalan lambat, maka overhead koneksi akan menjadi bagian kecil dari pemrosesan Anda saat ini, jadi SQLAlchemy hanya akan membuat sedikit peningkatan

Apakah saya perlu menutup koneksi mysql?
gila. 11163 posting. Staf PythonAnywhere. Jan. 10, 2017, 12. 37 hal. m. .

Mengenai penggunaan SQLAlchemy di aplikasi Anda, saya sarankan Anda melihat tutorial yang saya tautkan sebelumnya. Namun, itu tidak menggunakan SQL mentah untuk terhubung ke database - itu menggunakan pemetaan objek-relasional SQLAlchemy, yang menyediakan cara yang baik untuk menggunakan kueri yang dioptimalkan yang cenderung berjalan lebih cepat daripada SQL buatan tangan

Jika Anda benar-benar membutuhkan SQL mentah, maka kode yang dimodifikasi ini sudah cukup

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://{username}:password}@{hostname}/{databasename}".format(
    username="xxx",
    password="xxx",
    hostname="xxx.mysql.pythonanywhere-services.com",
    databasename="xxx$default",
)
app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI
app.config["SQLALCHEMY_POOL_RECYCLE"] = 299

db = SQLAlchemy(app)

@app.route('/Kj', methods=['GET'])
def ABC():
    a = db.session.execute("SELECT * FROM KJ")
    return jsonify({'Stock': a})

Apakah saya perlu menutup koneksi mysql?
gila. 11163 posting. Staf PythonAnywhere. Jan. 10, 2017, 12. 46 hal. m. .

Selain itu, db. sidang. eksekusi hanya dapat dijalankan di baris perintah konsol (masukkan baris demi baris) tetapi tidak dalam skrip. Melakukan percobaan sederhana dengan mengomentari db. sidang. jalankan kembali "hihi", tetapi memiliki kesalahan server internal jika tidak mengomentari db. sidang. menjalankan

from flask import Flask,jsonify,abort,make_response,request,render_template
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
import MySQLdb
import MySQLdb.cursors
from collections import OrderedDict
import json


app = Flask(__name__)
SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://{username}:{password}@{hostname}/{databasename}".format(
    username="xxx",
    password="xxx",
    hostname="xxx.mysql.pythonanywhere-services.com",
    databasename="xxx$default",
    )
app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI
app.config["SQLALCHEMY_POOL_RECYCLE"] = 299

db = SQLAlchemy(app)

@app.route('/KJ', methods=['GET'])
def KLSE1():
    call = db.session.execute("SELECT * FROM KJ")
    #col = ['index','Stock','Name','MACD','STOCH','RSI','ATR','Bollinger','SMA','SMAcross','Momentum','Volume_changes_pc','Previous_close','Change','Change_pc','R1','R2','S1','S2','52w_High','52w_Low','52w','50d','Trend_date','Stockcode','Syariah','Trade','BUY_total','HOLD_total','SELL_total','Market_sentiment','gin','Time','Market','Vin_change','Grading','Yield','EPS','DPS','Net_Margin','EPS_1g','EPS_5g','ROE','ROA','ROI','divpayout','PER','Fix','PEG','PEGY','CF_per_share','BV_per_share','QQ','QoQ','value_BG','NAV','Next_Report','Last_Report']
        #a = call.fetchmany(5)
    #d = [OrderedDict(zip(col,t)) for t in a]
    #json.dumps(d, ensure_ascii=False)
    return "hihi"
_

sesi bukan untuk ORM?

catatan eror

2017-01-12 07:56:39,184 :Exception on /KJ [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/xxx/mysite/flask_app.py", line 33, in KJ
    call = db.engine.execute("SELECT * FROM KJ")
  File "/usr/local/lib/python2.7/dist-packages/flask_sqlalchemy.py", line 746, in engine
    return self.get_engine(self.get_app())
  File "/usr/local/lib/python2.7/dist-packages/flask_sqlalchemy.py", line 763, in get_engine
    return connector.get_engine()
  File "/usr/local/lib/python2.7/dist-packages/flask_sqlalchemy.py", line 443, in get_engine
    self._engine = rv = sqlalchemy.create_engine(info, **options)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/__init__.py", line 332, in create_engine
    return strategy.create(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 64, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/dialects/mysql/mysqlconnector.py", line 77, in dbapi
    from mysql import connector
  File "./mysql.py", line 133, in <module>
    curs.close()
NameError: name 'curs' is not defined
_

Saya punya mysql. py di /vinasia saya, tetapi kesalahan tetap ada bahkan saya menghapus mysql. py

Apakah saya perlu menutup koneksi mysql?
vinasia. 157 posting. Jan. 12, 2017, 1. 46 sebuah. m. .

Saya memiliki banyak API yang sebelumnya harus diubah ke sqlalchemy. Sebagian besar dari mereka menggunakan placeholder %s di MySQLdb tetapi sekarang perlu diubah ke sqlalchemy. Saya kesulitan tentang sqlalchemy karena formatnya berbeda dari mysqldb

Kode di bawah ini. Saya baru saja mengomentari bagian yang sebelumnya saya gunakan dengan mysqldb

@app.route('/KJ/<Stock>', methods=['GET'])
def KJstock(Stock):
    #db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='xxx',passwd='xxx',db='xxx$default',cursorclass=MySQLdb.cursors.DictCursor)
    #curs = db.cursor()
    try:
        call = db.session.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))
        col = ['index','Stock','Name','MACD','STOCH','RSI','ATR','Bollinger','SMA','SMAcross','Momentum','Volume_changes_pc','Previous_close','Change','Change_pc','R1','R2','S1','S2','52w_High','52w_Low','52w','50d','Trend_date','Stockcode','Syariah','Trade','BUY_total','HOLD_total','SELL_total','Market_sentiment','dex','Time','Market','Vin_change','Grading','Yield','EPS','DPS','Net_Margin','EPS_1g','EPS_5g','ROE','ROA','ROI','divpayout','PER','dex','PEG','PEGY','CF_per_share','BV_per_share','QQ','QoQ','value_BG','NAV','Next_Report','Last_Report']

        c = call.fetchall()
        d = [OrderedDict(zip(col,t)) for t in c]
    except Exception:
        return 'Error: unable to fetch items'
    return jsonify({'Stock': d})

Apakah saya perlu menutup koneksi mysql?
vinasia. 157 posting. Jan. 12, 2017, 12. 46 hal. m. .

Hai Giles,

Saya memberikan nama stok, itu menunjukkan traceback

Stock ='SHELL'
>>> db.session.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))
>>>Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/scoping.py", line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py", line 978, in execute
    clause, params or {})
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 720, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/sql/elements.py", line 317, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 793, in _execute_clauseelement
    keys = distilled_params[0].keys()
AttributeError: 'tuple' object has no attribute 'keys'

ketika saya menggunakan mysqldb

curs.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))

memberikan output yang benar juga,

db.engine.execute("SELECT * FROM KLSE WHERE Stock LIKE %s",(Stock,))

memberikan output yang benar juga. Tapi saya tidak yakin bagaimana db. mesin. mengeksekusi berbeda dari db. sidang. jalankan dan saya kira db. sidang. mengeksekusi lebih baik untuk aplikasi saya

Apa yang terjadi jika Anda tidak menutup koneksi MySQL?

Akibatnya, pengguna akan melihat kesalahan SQL alih-alih halaman web yang bagus . Lebih baik buka koneksi untuk membaca data, lalu tutup, lalu tampilkan data dan setelah pengguna mengklik "kirim" Anda membuka koneksi lain lalu mengirimkan semua perubahan.

Haruskah Anda menutup koneksi MySQL setelah setiap permintaan?

Koneksi seharusnya menahan sumber daya . Itu yang kamu mau. Jika Anda terus-menerus mengalokasikan/membatalkan alokasi koneksi, Anda melakukan lebih banyak pekerjaan, setiap saat. Jika Anda memiliki proses berjalan lama yang harus berbicara dengan MySQL terus-menerus, buka satu koneksi dan biarkan tetap terbuka.

Apakah perlu untuk menutup koneksi database?

Mengandalkan pengumpulan sampah, terutama dalam pemrograman basis data, adalah praktik pemrograman yang sangat buruk. Anda harus membiasakan diri untuk selalu menutup koneksi dengan metode close() yang terkait dengan objek koneksi . Untuk memastikan koneksi ditutup, Anda dapat memberikan blok 'akhirnya' dalam kode Anda.

Apa yang terjadi jika saya tidak menutup koneksi database?

Jika Anda tidak menutupnya, itu bocor, dan mengikat sumber daya server . @EJP Koneksi itu sendiri mungkin thread-safe (diperlukan oleh JDBC), tetapi aplikasi yang menggunakan koneksi tersebut mungkin tidak threadsafe. Pikirkan hal-hal seperti isolasi transaksi yang berbeda, batasan (commit/rollback/autocommit) dll.