Как вытащить SQL-ошибку при «The EntityManager is closed»?
У Доктрины какой-то интересный подход к ошибкам. При любом проблемном SQL-запросе подключение к базе обрывается, а при следующем запросе получаем абстрактную ошибку "The EntityManager is closed".
А как получить именно ту SQL-ошибку которая сломала EntityManager, и проблемный SQL-запрос?
В логах симфони ошибка не залогировалась (это отдельная замечательная способность симфони периодически не писать свои логи).
Да, я знаю, что ошибку можно посмотреть при $entityManager->flush(), но в проекте сотни мест где этот метод вызывается, и искать среди них проблемный - не вариант.
Да, я знаю, что ошибку можно посмотреть при $entityManager->flush(), но в проекте сотни мест где этот метод вызывается, и искать среди них проблемный - не вариант.
То есть вы поленились при написание программы? Здорово, если уж вам так лень, могли просто сделать обёртку вокруг flush() и вызывать её.
Как вариант повесьте слушатель на flush и отлавливайте там ошибку. https://www.doctrine-project.org/projects/doctrine...
ошибку не проблема получить — когда поймали, тогда и получили
ORM с паттерном DataMapper — это не либа для "делать запросы", а штука, которая СИНХРОНИЗИРУЕТ состояние приложения... если была ошибка в харнилище, то ORM не может далее ручаться за стейт и потому закрывается. Эт опо дизайну
Но тк к этой ORM отношение "штука для запросов" (ну она и правда удобна в этом плане, хоть и не для этого) — получается ее юзают при обработке списка записей в командах, например, и вот на такую особенность натыкаются... когда хотят пропустить и пойти по записям дальше
По идее при флаше есть ошибка, нужно ее достать, а не гасить, перезапустить например EM
По идее при флаше есть ошибка, нужно ее достать, а не гасить, перезапустить например EM
Она и не гасится, она перехватывается логгирующей прокси, НО в момент когда прокси пытается сохранить свой лог в базу - он не может этого сделать потому что EntityManager уже сломался.
Прихожу к выводу, что без обертки над EntityManager, которая будет автоматически восстанавливать подключение к базе - вообще невозможно нормально работать. Но если это так - почему это не делается сразу из коробки...
HellWalk, не встречал проблемы с логированием. Если есть проблемы, создайте issue на гитхабе и напишите как воспроизвести. Сюда по вашему вопросу, у вас 100% воспроизведение не логирования ошибки (если конечно в самом коде вы не накосячили).
HellWalk, при чём тут именно файликовые логи? Я вообще говорю, работать через очередь, раз у вас там тысячи воркеров. А если отвалится, то восстановите и продолжите вытаскивать старую очередь.