问题描述
我的Django Web应用程序可以很好地部署,但是在对Postgres进行几次查询后,我的数据库连接已达到最大值。
这是我对我的问题的理解: 每次查询都会打开与Postgres的db连接,但不会关闭,一旦达到最大连接,就会导致db超时。
Heroku documentation for this error,但我认为无论通过升级启用了多少新的连接,这些连接也将很快达到最大值。 (或者我错了吗?)
pg:killall不能解决我的问题。该解决方案在该应用程序中不能是手动的。
我已将Heroku文档用于Concurrency and DB connection in Django
与此SO question相关,但是答案不能解决我的问题
调试错误
FATAL: too many connections for role "DB_username"
错误回溯失败点
conn = _connect(dsn,connection_factory=connection_factory,**kwasync)
在cmd中运行heroku pg:info --app应用程序名称
=== DATABASE_URL
Plan: Hobby-dev
Status: Available
Connections: 20/20 <<<<<<<<<<<<<<<<<<<<<
PG Version: 12.4
Created: 2020-09-11 16:57 UTC
Data Size: 9.3 MB
Tables: 15
Rows: 85/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-infinite-00894
这是我尝试过的事情:
- 设置dj_database_url.config(conn_max_age == 0,...)
- 使用Pgbouncer缓冲池连接
- 禁用服务器端游标
Settings.py
# PRODUCTION SETTINGS
MIDDLEWARE.append('whitenoise.middleware.WhiteNoiseMiddleware')
DATABASE_URL = os.environ['DATABASE_URL']
disABLE_SERVER_SIDE_CURSORS = True
SECRET_KEY = os.environ.get('SECRET_KEY')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesstorage'
#HEROKU SETTINGS
DATABASES['default'] = dj_database_url.config(conn_max_age=0,ssl_require=True)
django_heroku.settings(locals())
已安装pgbouncer buildpack
web: bin/start-pgbouncer
web: daphne appname.asgi:application --port $PORT --bind 0.0.0.0 -v2
chatworker: python manage.py runworker --settings=appname.settings -v2
这是唯一对我有用的procfile,我在其他论坛上看到人们抱怨您不能进行2次Web dynos,这对我有用,pgbouncer在部署时成功启动,daphne也可以。使用Web和Web2使应用程序崩溃。话虽如此,我愿意尝试所有建议。
asgi.py,以防万一
import os
import django
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE","Stonks.settings")
django.setup()
application = get_default_application()
与此相关的文档非常混乱,其他SO /代码论坛也未建议我没有尝试过的任何内容。弄清楚这是Django代码问题,Heroku配置问题还是daphne问题也将非常有帮助。
consumers.py示例
class StatsConsumer(AsyncConsumer):
"""Creates your stats websocket for each connected user"""
async def websocket_connect(self,event):
"""Connects to HTML and JS websocket for your stats"""
await self.send({
"type": "websocket.accept"
})
player = self.scope['user']
player_bids_list = await self.get_bids(player)
result_dict = await self.find_stats(player_bids_list)
await self.send({
"type": "websocket.send","text": json.dumps(result_dict),})
async def websocket_receive(self,event):
"""Is called when yourStats.html pings server for updated data"""
player = self.scope['user']
player_bids_list = await self.get_bids(player)
result_dict = await self.find_stats(player_bids_list)
await self.send({
"type": "websocket.send",})
async def websocket_disconnect(self,event):
"""Is called when websocket disconnects"""
print("disconnected",event)
@database_sync_to_async
def get_profile(self,user):
"""fetches user profile funds asynchronously"""
return Profile.objects.get(user=user).funds
@database_sync_to_async
def get_bids(self,user):
"""fetches the connected user's bids and returns all bids based on id,asynchronously"""
userid = User.objects.get(username=user).id
result = Bid.objects.filter(username_id=userid)
returnlist = []
for i in result:
returnlist.append(i.amount)
return returnlist
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)