MySQL返回“连接太多”错误

时间:2020-06-28 18:20:58

标签: mysql go database-connection

我正在做这样的事情:

import React, { useEffect, useState } from 'react';
import styles from './app.module.scss';
import { List } from 'antd';
import { getDataList } from '../../services';
import { Case } from '../../interfaces/Case';
import moment from 'moment';
import 'moment/locale/ar';

const App = () => {

  const [todayData, setTodayData] = useState<Case[]>([]);
  const [yesterdayData, setYesterdayData] = useState<Case[]>([]);
  const [data, setData] = useState<Case[]>([]);

  moment.locale('ar')
  let todaysDate = new Date();
  let yesterdayDate = new Date(todaysDate);
  yesterdayDate.setDate(todaysDate.getDate() - 1);
  const today = moment(todaysDate).locale('ar').format('dddd, DD MMM');
  const yesterday = moment(yesterdayDate).locale('ar').format('dddd, DD MMM');

  useEffect(() => {
    getDataList()
  .then((res) => {

    const todayList = res.data.filter(function (data: Case) {
      return moment(data.createdAt).locale('ar').format('dddd, DD MMM') === today;
    });

    const yesterdayList = res.data.filter(function (data: Case) {
      return moment(data.createdAt).locale('ar').format('dddd, DD MMM') === yesterday;
    });

    const list = res.data.filter(function (data: Case) {
      return data.createdAt !== today && data.createdAt !== yesterday;
    });

    setTodayData(todayList);
    setYesterdayData(yesterdayList);
    setData(list);
  })
  .catch((error) => {
  });
  }, []);

 return (
<>
  <List
    className={styles['today_style']}
    dataSource={todayData}
    renderItem={(item) => (
      <List.Item>
        <h1> Hiiii today  {item.createdAt}    </h1>>
      </List.Item>
    )}
  />

  <List
    className={styles['yesterday_style']}
    dataSource={yesterdayData}
    renderItem={(item) => (
      <List.Item>
        <h1> Hiiii yesterday  {item.createdAt}    </h1>>
      </List.Item>
    )}
  />

  <List
    className={styles['style']}
    dataSource={data}
    renderItem={(item) => (
      <List.Item>
        <h1> Hiiii  {item.createdAt}    </h1>>
      </List.Item>
    )}
  />
</>
);
 };
export default App;

它适用于前150个查询(为此,我正在使用另一个函数进行查询),但此后,我得到了错误消息:

import(
    "database/sql"
    "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func main() {
    var err error
    db, err = sql.Open(...)

    if err != nil {
        panic(err)
    }

    for j := 0; j < 8000; j++ {
        _, err := db.Query("QUERY...")
        
        if err != nil {
            logger.Println("Error " + err.Error())
            return
        }
    }
 }

很明显,我在做错事,但是我找不到它。我不知道如何打开和关闭每个查询的新连接。

mysqli_real_connect(): (HY000/1040): Too many connections

1 个答案:

答案 0 :(得分:2)

每次调用Query()时,您都在创建一个新的数据库句柄。每个活动句柄都需要一个唯一的数据库连接。由于您没有调用Close,因此该句柄以及连接一直保持打开状态,直到程序退出。

在完成每个查询后,致电rows.Close()来解决问题:

    for j := 0; j < 8000; j++ {
        rows, err := db.Query("QUERY...")
        if err != nil {
            logger.Println("Error " + err.Error())
            return
        }
        // Your main logic here
        rows.Close()
    }

Close()调用通常在defer语句中调用,但这排除了for循环的使用(因为defer仅在函数返回时才执行),因此您可以想要将您的主要逻辑移至新功能:

    for j := 0; j < 8000; j++ {
        doStuff()
    }

// later

func doStuff() {
    rows, err := db.Query("QUERY...")
    if err != nil {
        logger.Println("Error " + err.Error())
        return
    }
    defer rows.Close()
    // Your main logic here
}

相关问题