Как мне управлять / закрывать соединения, если я не могу изменить переменную max_user_connections? - PullRequest
1 голос
/ 18 февраля 2020

Я использую виртуальный хостинг, для которого максимальное число пользовательских подключений установлено на 30. Я связался с ними, и они сказали, что не могут изменить это значение. Просматривая мой веб-сайт, я получаю исключение, которое говорит:

SQLSTATE[42000]: Syntax error or access violation: 1203 User id12578877_odonto already has more than 'max_user_connections' active connections

Большинство действий в моем вебе - это просто репозитории (которые были созданы с помощью команды make: crud), фильтрующие некоторые данные. При быстром переключении между этими страницами в течение 30 с я получаю эту ошибку.

Можно ли как-нибудь уменьшить количество соединений или просто сделать что-нибудь, что могло бы помочь?

Вот пример того, как выглядят некоторые действия в моем контроллере:

    /**
     * @Route("/", name="pacientai_index", methods={"GET"})
     */
    public function index(PacientaiRepository $pacientaiRepository): Response
    {
        if($this->getUser()==null){
            return $this->redirectToRoute('main');
        }
        if($this->getUser()->getRole()=="NEW"){
            return $this->redirectToRoute('main');
        }
        if($this->getUser()->getMiestas()=="London"){
            return $this->redirectToRoute('main');
        }
        return $this->render('pacientai/index.html.twig', [
            'pacientais' => $pacientaiRepository->findByStatus("NEW"),
            'sutarti' => $pacientaiRepository->findByStatus("SUTARTAS"),
        ]);
    }

    /**
     * @Route("/mine", name="pacientai_index_mine", methods={"GET", "POST"})
     */
    public function myPatients(PacientaiRepository $pacientaiRepository, UserRepository $userRepository): Response
    {
        if($this->getUser()==null){
            return $this->redirectToRoute('main');
        }
        if($this->getUser()->getRole()=="NEW"){
            return $this->redirectToRoute('main');
        }
        if($this->getUser()->getMiestas()=="London"){
            return $this->redirectToRoute('main');
        }
        $entityManager = $this->getDoctrine()->getManager();
        $entity = $this->getDoctrine()
            ->getRepository(User::class)
            ->find($this->getUser()->getId());
        $entity->setYraNauju(0);
        $entityManager->persist($entity);
        $entityManager->flush();
        return $this->render('pacientai/myPatients.html.twig');
    }

Я что-то здесь не так делаю, что может вызвать это?

Я получил эту ошибку при тестировании только с одним пользователем. Стало бы еще хуже, если бы, скажем, к веб-сайту было подключено 20 пользователей?

Если есть слишком много открытых соединений, как я могу сделать так, чтобы все запросы были от одного соединения?

1 Ответ

1 голос
/ 18 февраля 2020

После того, как вы сделаете все, что вам нужно, вы можете сделать следующее:

$entityManager->getConnection()->close();

Или, если у вас есть класс, который его обрабатывает, вы можете поместить этот код в метод __destruct, а затем работает сборщик мусора, он также закроет соединение, например:

public function __destruct()
{
   $entityManager = $this->getDoctrine()->getManager();
   $entityManager->getConnection()->close();
}
...