티스토리 뷰
mysql-connector-java -> mariadb-connector-j 로 변경할때 같은 데이터를 바라보지만 다른 값이 리턴될 수 있다.
books 테이블에는 deleted 필드가 존재하고 해당 필드에는 CHAR 형식으로 삭제 여부 데이터가 저장된다.
- deleted = 'Y' : 삭제된 책
- deleted = 'N' : 삭제되지 않은 책
ResultSet.getBoolean() 함수를 이용하여 해당 필드의 데이터를 가져오면 'Y', 'N' 의 Char 값을 boolean 으로 리턴해준다.
이때 mysql-connector-java 와 mariadb-connector-j 의 동작 방식 차이에 의해서 리턴값이 달라진다.
Connector | Data | Return boolean |
mysql-connector-java | 'N' | false |
mariadb-connector-j | 'N' | true |
mysql-connector-java | 'Y' | true |
mariadb-connector-j | 'Y' | true |
mysql-connector-java 를 사용할 당시에는 'N' 은 false 로 제대로 맵핑되었는데 mariadb-connector-j 를 사용하게 되면서 'N' 이 true 로 리턴되기 시작한 것이다.
이는 두 Connector 가 ResultSet 을 구현할때의 로직 차이에 의해서 발생한다.
mysql-connector-java : ResultSetImpl.java
private final boolean getBooleanFromString(String stringVal, int columnIndex) throws SQLException {
if (stringVal != null && stringVal.length() > 0) {
int c = Character.toLowerCase(stringVal.charAt(0));
return c == 't' || c == 'y' || c == '1' || stringVal.equals("-1");
} else {
return false;
}
}
mysql connector 가 구현한 ResultSet.getBoolean() 함수에서는 't', 'y', '1' 에 대해서 true 로 리턴해주고 있으며 이에 해당하지 않은 모든 값은 false 를 기본으로 리턴하게 된다.
mariadb-connector-j : TextRawProtocol.java
public boolean getInternalBoolean(ColumnDefinition columnInfo) {
if (lastValueWasNull()) {
return false;
}
if (columnInfo.getColumnType() == ColumnType.BIT) {
return parseBit() != 0;
}
final String rawVal = new String(buf, pos, length, StandardCharsets.UTF_8);
return !("false".equals(rawVal) || "0".equals(rawVal));
}
mariadb connector 가 구현한 ResultSet 에서는 'false', '0' 에 대해서만 false 를 리턴하고 이에 해당하지 않는 모든 값은 false 를 리턴하는 로직이다.
이 차이에 의해서 저장된 데이터가 'N' 이라면 mysql connector 일때는 false, mariadb connector 일때는 true 가 리턴되었다.
저장된 데이터를 다른 타입으로 불러올때 이러한 문제가 있을 수 있으며 가능하면 운영중인 서비스의 Connector 를 변경하는 작업은 지양해야겠다.
또한, Connector 의 구현에 따라서 타입 변환보다는 데이터는 있는 그대로 불러오고 타입 변환은 자체 구현하는게 안전해보인다.
'JAVA' 카테고리의 다른 글
JVM GC 후 Heap 에게 할당된 물리 메모리 OS에게 회수 여부 (0) | 2022.01.03 |
---|---|
-Xms 보다 Memory 사용량이 더 적은 이유 (0) | 2021.12.31 |
mariadb-connector-j Aurora read/write seperate 과정 (0) | 2021.10.08 |
자바 separate chaining in HashMap (0) | 2021.06.04 |
JAVA HashMap 과 동시성 #1 (Pub/Sub) (2) | 2021.06.04 |
- Total
- Today
- Yesterday
- spring cloud gateway
- rate limit
- DyanomoDB
- mariadb-connector-j
- router
- reactor
- msyql-connector-java
- aurora
- mariada-connector
- HashMap
- notify()
- MariaDB
- AbstractMethodError
- RouteDefinition
- getBoolean
- custom config data convertion
- Lazy
- reative
- RoutePredication
- Flux
- ResultSet
- notifyAll()
- wait()
- referencedColumnName
- N+1
- ConcurrentHashMap
- circurit breaker
- GlobalFilter
- Seperate Chaining
- dynamodb
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |