Apakah mysql menutup koneksi secara otomatis?

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}]

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 sesi. 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}]
_

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?

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

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}]

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 
    curs.close[]
NameError: name 'curs' is not defined
_

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

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/', 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}]

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 "", line 1, in 
  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

Berapa lama MySQL menjaga koneksi tetap terbuka?

MySQL menyetel nilai default variabel wait_timeout ke 28800 detik [8 jam].

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.

Bagaimana cara menjaga koneksi MySQL saya tetap hidup?

Untuk mencegah koneksi ini ditutup secara otomatis, konektor dapat dikonfigurasi agar koneksi tetap hidup dengan mengirimkan pernyataan SELECT sederhana [sebenarnya SELECT 'KEEP_ALIVE';] secara berkala to ensure that the MySQL timeout is not reached and the connection closed.

Apa itu batas waktu koneksi MySQL?

Kesalahan Waktu Habis Koneksi terjadi saat firewall database tidak mengizinkan Anda untuk terhubung ke database dari mesin atau sumber daya lokal Anda . Jika Anda mendapatkan kesalahan ini, periksa apakah Anda telah menambahkan mesin atau sumber daya yang Anda sambungkan ke daftar sumber tepercaya database.

Bài mới nhất

Chủ Đề