문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
database:mysql:jdbc [2016/03/28 17:36] kwon37xi |
database:mysql:jdbc [2024/01/16 09:53] (현재) kwon37xi [sessionVariables] |
||
---|---|---|---|
줄 4: | 줄 4: | ||
* JDBC URL for utf-8 : < | * JDBC URL for utf-8 : < | ||
* [[http:// | * [[http:// | ||
+ | |||
+ | ===== Schema ===== | ||
+ | * 일반적인 데이터베이스의 Schema 개념을 지원하지 않기 때문에 JDBC DatabaseMetaData 에서 schema 관련해서 항상 null 값이 반환되는 문제가 발생할 수 있다. catalog 개념을 사용해야 한다.[[https:// | ||
+ | |||
+ | > You're correct. For legacy reasons (including compatibility with ODBC, and SQL Server), JDBC's concept of " | ||
+ | > Starting in MySQL-4.1, " | ||
==== PreparedStatement 분석 ==== | ==== PreparedStatement 분석 ==== | ||
줄 10: | 줄 16: | ||
* MySQL 5.0 이하에서는 PreparedStatement 사용으로 인한 이점이 거의 없어서 ClientPreparedStatement로 사용해도 무관하다. | * MySQL 5.0 이하에서는 PreparedStatement 사용으로 인한 이점이 거의 없어서 ClientPreparedStatement로 사용해도 무관하다. | ||
* MySQL 5.1 이상에서는 제대로 PreparedStatement가 서버사이드에서 구현되었고 PrepraedStatement에도 쿼리 캐시가 적용되었다. - 근데 테스트해보니 안빠르고 오히려 더 느린데?? 테스트 철저히 하고 사용여부 결정할 것. | * MySQL 5.1 이상에서는 제대로 PreparedStatement가 서버사이드에서 구현되었고 PrepraedStatement에도 쿼리 캐시가 적용되었다. - 근데 테스트해보니 안빠르고 오히려 더 느린데?? 테스트 철저히 하고 사용여부 결정할 것. | ||
- | * PreparedStatemtn | + | * '' |
SELECT * FROM information_schema.global_status | SELECT * FROM information_schema.global_status | ||
WHERE variable_name IN (' | WHERE variable_name IN (' | ||
줄 28: | 줄 34: | ||
* 이를 서버 커서 방식으로 바꾸려면 JDBC URL에 '' | * 이를 서버 커서 방식으로 바꾸려면 JDBC URL에 '' | ||
* Server Cursor를 사용하면 자동으로 '' | * Server Cursor를 사용하면 자동으로 '' | ||
+ | |||
+ | ===== useSSL=false / sslMode=DISABLED ===== | ||
+ | * [[https:// | ||
+ | * mysql JDBC Driver 는 '' | ||
+ | * 이는 개발자가 모르는 사이에 SSL 인증서 만료등이 발생했을 때 문제 소지가 있다. | ||
+ | * 8.0 드라이버 부터는 '' | ||
+ | * '' | ||
==== Datetime 0 ==== | ==== Datetime 0 ==== | ||
줄 41: | 줄 54: | ||
===== Replication JDBC Driver ===== | ===== Replication JDBC Driver ===== | ||
- | * 계속 사용해본 결과 **Replication Driver는 사용하지 않는 것이 좋겠다**. | + | * 계속 사용해본 결과 **Replication Driver는 사용하지 않는 것이 좋겠다 |
* Java 사용시에는 [[java: | * Java 사용시에는 [[java: | ||
- | * read/write 중 한쪽작업으로 몰릴 경우 Connection Pool입장에서는 어쨌든 사용중인 커넥션이므로 ping 쿼리가 다른쪽으로는 날라가지 않아서 간헐적으로 사용되는 커넥션이 끊기는 일이 발생한다. | + | * read/write 중 한쪽작업으로 몰릴 경우 Connection Pool입장에서는 어쨌든 사용중인 커넥션이므로 ping 쿼리가 다른쪽으로는 날라가지 않아서 간헐적으로 사용되는 커넥션이 끊기는 일이 발생한다. |
- | * ping이 안날라가서 끊기는 문제는 Proxy나 MySQL서버의 접속 끊는 시간 이전에 커넥션 풀에서 커넥션을 무조건 끊고 다시 맺는 옵션을 주면 해결된다.(BoneCP, DBCP2 등은 이런 옵션을 제공한다) | + | * ping이 안날라가서 끊기는 문제는 Proxy나 MySQL서버의 접속 끊는 시간 이전에 커넥션 풀에서 커넥션을 무조건 끊고 다시 맺는 옵션을 주면 해결된다.('' |
* 일반적으로 Master보다는 Slave에 커넥션이 많이 필요한데 이 드라이버를 사용하면 항상 동수의 커넥션을 맺는다. 따라서 Master에 불필요한 커넥션 수 증가가 발생한다. | * 일반적으로 Master보다는 Slave에 커넥션이 많이 필요한데 이 드라이버를 사용하면 항상 동수의 커넥션을 맺는다. 따라서 Master에 불필요한 커넥션 수 증가가 발생한다. | ||
* JVM의 메모리 점유율이 높아지는 것 같다. ReplicationDriver를 사용하면 Full GC 빈도가 더 높아지는 현상이 발견되었다. | * JVM의 메모리 점유율이 높아지는 것 같다. ReplicationDriver를 사용하면 Full GC 빈도가 더 높아지는 현상이 발견되었다. | ||
- | * ping 문제만 해결하면 사용 자체에 큰 문제는 없다. | + | * ping 문제만 해결하면 사용 자체에 큰 문제는 없다. -> 해결됨. |
- | * [[http:// | + | * [[https:// |
* Connection.setReadOnly()에 지정된 값에 따라 쓰기일 때는 마스터, 그 외에는 슬레이브로 보내는 처리를 해준다. Spring @Transactional(readOnly=" | * Connection.setReadOnly()에 지정된 값에 따라 쓰기일 때는 마스터, 그 외에는 슬레이브로 보내는 처리를 해준다. Spring @Transactional(readOnly=" | ||
* [[http:// | * [[http:// | ||
줄 60: | 줄 73: | ||
* '' | * '' | ||
* To enable this functionality, | * To enable this functionality, | ||
- | * Ping용 쿼리를 주로 '' | + | * Ping용 쿼리를 주로 '' |
* '' | * '' | ||
- | * [[http:// | + | * [[http:// |
* 관련 해결책이 5.1.27 에 나온듯. | * 관련 해결책이 5.1.27 에 나온듯. | ||
* '' | * '' | ||
줄 83: | 줄 96: | ||
* MySQL이 생성하는 모든 쿼리의 로그를 남길 수 있다. | * MySQL이 생성하는 모든 쿼리의 로그를 남길 수 있다. | ||
* '' | * '' | ||
- | * '' | + | * '' |
+ | * [[https:// | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ==== sessionVariables ==== | ||
+ | * [[https:// | ||
+ | * connection 을 맺을 때마다 세션에 대해 '' | ||
+ | * https:// | ||
+ | === 8.x === | ||
+ | < | ||
+ | jdbc: | ||
+ | </ | ||
+ | |||
+ | === 7.x 이전 === | ||
+ | < | ||
+ | jdbc: | ||
+ | </ | ||
+ | ===== allowMultiQueries ===== | ||
+ | * MySQL JDBC는 기본적으로 하나의 SQL 실행 요청에 여러 SQL을 실행하는 것을 금지하고 있다.(세미콜론(; | ||
+ | * 실서비스에서는 사용하지 말고, 테스트시에 필요한 경우 '' | ||
+ | * '' | ||
===== Interceptor ===== | ===== Interceptor ===== |