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}]
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}]
_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?
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 peningkatanMengenai 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}]
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
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}]
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