DB 성능이 좋지 않다고 느껴 mysql에서 현재 connection을 조회해보았는데 각각의 connection이 어느쪽에서 들어온 connection인지 정확히 구분하기가 어려웠다. 그래서 해당 connection이 어디에서 붙어있는것인지 확인해보고 싶었다
기존상태
검색해보니 mysql에 connectionAttributes 에 특정 값을 넣어주면 위의 표에서 program에 None이 아닌 지정한 값이 뜬다고 해서 한 번 해보았다.
spring:
config:
activate:
on-profile: db-prod
datasource:
jdbc-url: jdbc:mysql://xx.xxx.xx.xxx:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul&connectionAttributes=program_name:KeywordDiaryBackendSpringBoot
username: myUsername
password: myPassword
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
pool-size: 10
연결 jdbc-url에 보면 connectionAttributes=program_name:KeywordDiaryBackendSpringBoot이라는 부분이 보일 것이다. 이 상태에서 어플리케이션을 구동하면
아래와 같이 Program 값이 지정한 (KeywordDiaryBackendSpringBoot) 값으로 나온다. connection이 어느 어플리케이션에서 붙었는지 확인해보고 싶을때 사용하면 유용할수도 있을거 같다.
mysql workbench의 Management > client connections에서 아래와 같은 ui를 제공하지만 다른 client에서 접속했을때에도
SELECT t.PROCESSLIST_ID,IF (NAME = 'thread/sql/event_scheduler','event_scheduler',t.PROCESSLIST_USER) PROCESSLIST_USER,t.PROCESSLIST_HOST,t.PROCESSLIST_DB,t.PROCESSLIST_COMMAND,t.PROCESSLIST_TIME,t.PROCESSLIST_STATE,t.THREAD_ID,t.TYPE,t.NAME,t.PARENT_THREAD_ID,t.INSTRUMENTED,t.PROCESSLIST_INFO,a.ATTR_VALUE FROM performance_schema.threads t LEFT OUTER JOIN performance_schema.session_connect_attrs a ON t.processlist_id = a.processlist_id AND (a.attr_name IS NULL OR a.attr_name = 'program_name') WHERE t.TYPE <> 'BACKGROUND'
아래와 같이 쿼리를 실행하면 비슷한 결과가 보일 것이다. 위의 쿼리를 보면 a.attr_name = 'program_name'을 조회해서 가져오는데 이것이 위에 접속시에 설정한 connectionAttributes=program_name:KeywordDiaryBackendSpringBoot 값을 불러오는 것으로 보인다.