【问题标题】:Django PSYCOPG2 db connectionDjango PSYCOPG2 数据库连接
【发布时间】:2019-01-24 05:35:09
【问题描述】:

我创建了一个带有以下views.py的django api

import datetime
import os
import traceback
from logging.handlers import TimedRotatingFileHandler
from logging import Formatter
from django.http import HttpResponse
import logging
# from . import models as m
import pandas as pd
import json
import psycopg2 as pg

# logger setup





def resp(status):
    //returns status code


def index(request):
    logger.info('request:' + str(request.GET))
    obj = DAA()
    if request.method == "GET":
        // get values from url request


        if (condition):
            try:
                connection = pg.connect(dbname="dbname", user="user", password="password")
                cursor = connection.cursor()
                response = obj.level1(arguments)
                response = obj.level2(arguments)
                try:
                    // check response
                except Exception as e:
                    # add exception to log


            except Exception as e:
                # add exception to log




        if response :
            json_data = {
                "responseCode": 200,
                "version": "1.0.0",
                "results":
                    [
                        // response
                    ]
            }
            json_dump = json.dumps(json_data)

            return HttpResponse(json_dump, content_type='application/json')
        elif not response :
            json_dump = resp(400)
            return HttpResponse(json_dump, content_type='application/json')


class DAA:
    def level1(arguments):
        GB = []
        if condition:
            query = //query
            try:
                query_df = pd.read_sql_query(query, connection)
                response = [i for i in query_df[//xyz]] // get values
            except Exception as e:
                cursor.execute('rollback;')
                # add exception to log
                return None

            gb_data = //response
            GB.append(gb_data)
            return GB
        else :
            argument = argument .upper()
            argument = argument .split(',')
            for i, val in enumerate(argument):
                query = //query
                try:
                    query_df = pd.read_sql_query(query, connection)
                    response = [i for i in query_df['xyz']]
                except Exception as e:
                    # add exception to log
                    return None

                gb_data = //response
                GB.append(gb_data)

            return GB

    def level2(arguments):
        if condition:
            argument = []
            try:
                cursor.execute( // query )

                return response

            except Exception as e:
                cursor.execute('rollback;')
                # add exception to log
                return None

        else :
            argument = []
            argument = argument.upper()
            argument = argument.split(',')
            for i, val in enumerate(argument):
                try:
                    cursor.execute( //query )

                except Exception as e:
                    # add exception to log
                    return None

            return response

使用上面的代码,我面临以下问题:

  1. 在 jmeter 上测试超过 100 个用户的应用程序时,我收到“客户端已经太多”错误,这似乎是 conf 文件 [max_connections = 100] 中的 postgres 数据库的问题,但增加了连接似乎对我不起作用,所以请提出其他建议。
  2. 即使为少于 100 个用户运行应用程序,我也会收到此错误“RuntimeError: can't start new thread”,所以请建议如何解决这个错误?
  3. 注意:- 请忽略编程错误,因为我只共享了我的代码的虚拟结构。

【问题讨论】:

    标签: python django multithreading apache psycopg2


    【解决方案1】:

    您是在使用后关闭连接,还是每次都打开一个新连接?

    可以尝试使用连接池。创建一个名为 mydb.py 的文件

    import psycopg2
    import psycopg2.pool
    from contextlib import contextmanager
    
    dbpool = psycopg2.pool.ThreadedConnectionPool(host=<<YourHost>>,
                                              port=<<YourPort>>,
                                              dbname=<<YourDB>>,
                                              user=<<YourUser>>,
                                              password=<<yourpassword>>,
                                              )
    
    @contextmanager
    def db_cursor():
        conn = dbpool.getconn()
        try:
            with conn.cursor() as cur:
                yield cur
                conn.commit()
        except:
            conn.rollback()
            raise
        finally:
            dbpool.putconn(conn)
    

    那么你的代码可以使用:

    import mydb
    
    def myfunction():
        with mydb.db_cursor() as cur:
            cur.execute("""Select * from blahblahblah...""")
    

    【讨论】:

    • 数据框查询“query_df = pd.read_sql_query(query, connection)”怎么样
    • 我现在应该改用“query_df = pd.read_sql_query(query, dbpool)”吗?
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2022-07-11
    • 2016-07-31
    • 2021-09-05
    • 2012-06-26
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多