이번시간에는 PROTOCOL_CONNECTION_LOST 에러에대해서 다뤄볼 예정입니다.
일단 기존 구조는 다음과같습니다.
db.js 에서는 db 정보 및 connect 와 error event 리스너가 있습니다.
이 코드를 middle1 , middle2 , middle3 에서 require로 참조해서 query 를 날리고 있습니다.
기존 구조에서 2가지 문제점이 있습니다.
첫번째 문제는 일단 mysql 의 wait_timeout을 28800초로 설정해둔 상태에서 시간이 경과하면 PROTOCOL_CONNECTION_LOST 이 발생하여 connection을 잃어버립니다.
설정은 마지막 query 이후 wait_timeout만큼 유지하다가 connect lost 가 발생하는 걸로 알고있엇는데 cloud 환경을 바꾸고 나서 부터는 연결한 시점 부터 wait_timeout 시간 후 connection 을 잃어버리더라요.. (db문제인지 다른 문제인지 원인 못찾음 )
그래서 connect lost가 발생 했을떄 재 연결하는 코드를 작성하였습니다.
db.js
```
```
문제는 db와 연결이 끊기고 재연결은 잘되만 , 재연결 이후부터는 query 가 undefined가 발생합니다.
( 테스트 환경 : wait_timeout 을 5초로 설정하고 7초에 한번씩 query를 발생시킴,middle1,middle2,middle3은 같은 코드를 사용합니다. )
log
연결 시도
연결 성공
db error Error: Connection lost: The server closed the connection.
at Protocol.end (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\protocol\Protocol.js:112:13)
at Socket.<anonymous> (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\Connection.js:94:28)
at Socket.<anonymous> (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:412:35)
at endReadableNT (internal/streams/readable.js:1317:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
fatal: true,
code: 'PROTOCOL_CONNECTION_LOST'
}
연결 시도
연결 성공
query 는 ?
query result : undefined
db error Error: Connection lost: The server closed the connection.
at Protocol.end (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\protocol\Protocol.js:112:13)
at Socket.<anonymous> (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\Connection.js:94:28)
at Socket.<anonymous> (C:\Users\ansgy\test\dbConnect\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:412:35)
at endReadableNT (internal/streams/readable.js:1317:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
fatal: true,
code: 'PROTOCOL_CONNECTION_LOST'
}
연결 시도
연결 성공
왜 이런일이 발생했는지 생각해보자면
index.js 에서 requrie로 불러온 시점의 db.js 의 connection 변수의 메모리 주소와 살아있는 시점이지만 재 연결된 후 db.js의 connection 변수의 메모리 주소가 바꼇다는 생각밖에안들더라고요.
그래서 query 진행전 db.js의 connection을 다시 가져와 요청하는 방법으로 바꿔 해결 했습니다
db.js
middle1.js
두번째는 middle1,middle2,middle3에서 db.js를 3번 require 하여 연결 세션을 3개 만듭니다.
해결방안으로 db.js와 middle1,2,3.js 사이에 dbConn.js을 두어서 connect 행위를 dbConn.js에서 한번만 진행하게 하여 처리하였습니다.
문제점 1과 2를 해결하여 반영한 코드는 아래 git을 참고하시면 됩니다.
https://github.com/baaaaaaaaaaaaam/nodejs_mysql_connectLost
GitHub - baaaaaaaaaaaaam/nodejs_mysql_connectLost
Contribute to baaaaaaaaaaaaam/nodejs_mysql_connectLost development by creating an account on GitHub.
github.com