대머리개발자

R2DBC ...불행의 시작... 본문

개발이야기/DataBase

R2DBC ...불행의 시작...

대머리개발자 2023. 4. 12. 21:49
728x90

이제 정말 몇 가닥 안 남았는데 ㅠ 진정 민머리가 얼마 안 남았다.. 가즈아!!

    //runtimeOnly 'io.asyncer:r2dbc-mysql:1.0.0'
    //runtimeOnly 'com.github.jasync-sql:jasync-r2dbc-mysql'
    //runtimeOnly 'org.mariadb:r2dbc-mariadb'
    runtimeOnly 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'

 

로컬의 개발환경은 마리아DB다. 마리아의 모태가 mysql이기 때문에 호환이 되는것 같다. 완벽하게는 아니지만..

 

각 라이브러리를 테스트 한 이유는 클라우드 환경에서 커넥션이 끊어졌다. 붙었다.. 끊어졌다.. 붙었다......힘들어 돌아 가시겠네...

 

20230412 16:41:15.001 [armeria-common-worker-epoll-3-4] DEBUG [ConnectionPool:254] - Obtaining new connection from the pool 
20230412 16:41:15.002 [armeria-common-worker-epoll-3-4] DEBUG [MySqlConnection:215] - Connection closing 
20230412 16:41:15.003 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:216] - Connection close succeed 
20230412 16:41:15.004 [reactor-tcp-epoll-2] DEBUG [ConnectionPool:254] - Obtaining new connection from the pool 
20230412 16:41:15.004 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:215] - Connection closing 
20230412 16:41:15.004 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:216] - Connection close succeed 
20230412 16:41:16.790 [armeria-common-worker-epoll-3-1] DEBUG [ConnectionPool:254] - Obtaining new connection from the pool 2
0230412 16:41:16.791 [armeria-common-worker-epoll-3-1] DEBUG [MySqlConnection:215] - Connection closing 
20230412 16:41:16.800 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:216] - Connection close succeed 
20230412 16:41:16.800 [reactor-tcp-epoll-2] DEBUG [ConnectionPool:254] - Obtaining new connection from the pool 
20230412 16:41:16.801 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:215] - Connection closing 2
0230412 16:41:16.801 [reactor-tcp-epoll-2] DEBUG [MySqlConnection:216] - Connection close succeed

 

누군가의 블로그에서 dev.miku.. 더 이상 지원 안 한다고 쓰지 말라고 한다. 실제 해당 깃을 가도 최종 커밋은 2년전..ㅎㄷㄷ

dev.miku -->  io.asyncer 변경 테스트

 

1. 날짜를 포팅하는 클래스가 다르닷.. 이런 뛰밤... 일단 주석 ㄱㄱ

(Timestamp --> ZonedDateTime)

 

2. 잘 돌아가는 코드가 정상적으로 되지 않았다.....물론 전체적으로 테스트 해보지 않았지만...  오류 뿜뿜!

public Mono<Boolean> deleteClient(String clientID){
        return clientRepository.deleteByClientId(clientID)
                .flatMap(ok -> ServiceUtil.getRedisService().delOpsForValue(Constants.REDIS_CLIENT + clientID))
                .flatMap(ok -> ServiceUtil.getScopeService().deleteMappingByClient(clientID))
                .onErrorMap(e -> new DefinedException(e.getMessage()));
    }

flatMap으로 진행한 친구들이 실행되지않구.. onErrorMap으로 고고싱하였다. ㅜ

reactor.core.Exceptions$ErrorCallbackNotImplemented: com.oauth.common.DefinedException: java.lang.Long cannot be cast to java.lang.Integer
Caused by: com.oauth.common.DefinedException: java.lang.Long cannot be cast to java.lang.Integer
	at com.oauth.client.ClientService.lambda$deleteClient$6(ClientService.java:92)
	at reactor.core.publisher.Mono.lambda$onErrorMap$31(Mono.java:3776)
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172)
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172)
	at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93)
	at reactor.core.publisher.FluxUsingWhen$UsingWhenSubscriber.deferredError(FluxUsingWhen.java:398)
..

 1. io.asyncer 일단 쓰레기통!!

어차피 ㅋㅋ 바꿔서 반영해도 커넥션 나가리데스 ㅠㅠ

 

2. org.mariadb..는 반대로 mysql DB에서는 지원이 아예 안된다. ㅋ

3. jasync 마지막...하기전에... pool 관련 셋팅을 해보자. ㅠ

 

r2dbc-pool 

spring :
  profiles:
    active:
      on-profile: prod
  r2dbc:
    url: ${r2dbc-url}
    username: ${r2dbc-username}
    password: ${r2dbc-password}
#    pool:
#      enabled: true
#      initial-size: 20
#      max-size: 20
#      max-idle-time: 10m
#      max-life-time: 30m
#      validation-query: select count(1) from client
#  data:
#    r2dbc:
#      repositories:
#        enabled: true

 

프로퍼티는...먹통이다..... 삽질 작렬!!s 

자바로 설정했더니 다행이도.......다행이도.ㅠㅠ 커넥션... 잘 유지s 프로퍼티 바로 주석. ㄱㄱㄱ

@Configuration
@EnableR2dbcRepositories
public class R2dbcConfig extends AbstractR2dbcConfiguration {

    @Value("${spring.r2dbc.url}")
    private String host;

    @Value("${spring.r2dbc.username}")
    private String username;

    @Value("${spring.r2dbc.password}")
    private String password;

    @Override
    @Bean
    public ConnectionFactory connectionFactory() {
        return ConnectionFactories.get(ConnectionFactoryOptions.builder()
                .option(ConnectionFactoryOptions.DRIVER, "pool")
                .option(ConnectionFactoryOptions.PROTOCOL, "mysql")
                .option(ConnectionFactoryOptions.HOST, host)
                .option(ConnectionFactoryOptions.PORT, 3306)
                .option(ConnectionFactoryOptions.USER, username)
                .option(ConnectionFactoryOptions.PASSWORD, password)
                .option(ConnectionFactoryOptions.DATABASE, "oauth2")
                .option(Option.valueOf("initialSize"), 10)
                .option(Option.valueOf("maxSize"), 20)
                .option(Option.valueOf("maxIdleTime"), Duration.ofMinutes(5))
                .option(Option.valueOf("maxLifeTime"), Duration.ofMinutes(5))
                .option(Option.valueOf("validationQuery"), "select 1+1")
                .build());
   }
}

 

 

※※ 2023.06.08 

계속적인 커넥션 문제로 인해서 

Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is dev.miku.r2dbc.mysql.client.MySqlConnectionClosedException:

 

io.asyncer 다시....이 친구로 적용

그래도 해당 lib는계 속적으로 관리가되고 있네요.

 

문제의 원인은 다른곳에 있었으니...

728x90

'개발이야기 > DataBase' 카테고리의 다른 글

게시판 코드에서...고민s  (0) 2023.10.24
[R2DBC] 바인딩  (0) 2023.09.13
R2DBC ...불행의 시작...(2)  (0) 2023.06.09
R2DBC 동적 쿼리는...쥐쥐s  (0) 2023.04.05
[우분투] 마리아DB 대/소문자 설정  (0) 2023.03.07