jdbc
Edit참조하는 jar파일 확인
pmap [pid] | grep jar
혹은 cat /proc/<pid>/smaps
ps axuw | grep java | grep -v grep | awk '{print $2}' | while read P; do pmap $P | grep 'spring' ; done
- Apache MaxClients와 Tomcat의 Full GC
- JDBC internal timeout의 이해
- Garbage Collection과 Statement Pool
Statement Cache
- https://vladmihalcea.com/how-does-the-mysql-jdbc-driver-handle-prepared-statements/
- https://dev.mysql.com/doc/refman/5.6/en/statement-caching.html
Connection pool
-
- iBatis는 JDBC 3.0이전에도 내부적으로 statement cache를 함. 그러나 ibatis session level의 cache이기 때문에 Driver level cache보다 효율이 떨어짐
- evictor 스레드가 실행될 때는 timeBetweenEviction RunMillis > 0
- Evictor 스레드 역할http://devyongsik.tistory.com/509\[http://devyongsik.tistory.com/509]
모니터링
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>
<%@ page import="
java.util.*,
javax.naming.*,
javax.sql.*,
org.apache.commons.beanutils.*,
org.apache.commons.dbcp.*"
%>
<%
Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("jdbc/Sims");
BasicDataSource bds = (BasicDataSource)ds;
try {
Map<Object,Object> desc = BeanUtils.describe(bds);
%>
<%=desc%>
<%
} catch(Exception e) {
out.println(e.toString());
}
%>
DBCP
Race condition error : https://issues.apache.org/jira/browse/DBCP-270
The pool is initialized the first time one of the following methods is
invoked:
getConnection, setLogwriter, setLoginTimeout, getLoginTimeout, getLogWriter.
testOnBorrow
removeAbandoned
- long connection의 경우 의도하지 않은 connection close 현상 발생 가능
<bean id="masterDs" class="org.apache.commons.dbcp.BasicDataSource" /> … <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="30" /> … </bean> |
if(abandonedConfig != null && abandonedConfig.getRemoveAbandoned()) connectionPool = new AbandonedObjectPool(null, abandonedConfig); else connectionPool = new GenericObjectPool(); … dataSource = new PoolingDataSource(connectionPool); |
| conn = (Connection)_pool.borrowObject(); |
if(config != null && config.getRemoveAbandoned() && getNumIdle() < 2 && getNumActive() > getMaxActive() - 3) removeAbandoned(); … if(pc.getLastUsed() ⇐ timeout && pc.getLastUsed() > 0L) remove.add(pc); … if(config == null |
!config.getRemoveAbandoned()) break MISSING_BLOCK_LABEL_54; synchronized(trace) { boolean foundObject = trace.remove(obj); |
성능비교
- JDBC SQL 구문에 클라이언트 정보 남기기 : http://kwon37xi.egloos.com/4860051
JDBC API 사용법
- 서블렛 + JDBC 연동시 코딩 고려사항 -제1탄-
- 서블렛 + JDBC 연동시 코딩 고려사항 -제2탄-
- 서블렛 + JDBC 연동시 코딩 고려사항 4
- 서블렛 + JDBC 연동시 코딩 고려사항 5
- 서블렛 + JDBC 연동시 코딩 고려사항 6
Statment를 안 가지면 maximum open cursor exceed ! 에러나 Limit on number of statements exceeded 에러 발생
- Top Ten Oracle JDBC Tips
- JDBC 드라이버의 4가지 타입 : http://www.onjava.com/pub/a/onjava/excerpt/javaentnut_2/index1.html
각종 DBMS JDBC 드라이버 셋팅법 정리
에러 관련
- Oracle Protocol-violation
- ORA-01000: maximum open cursors exceeded 조사
- ResultSet 의 close 메소드를 finally 에서 반드시 부르지 않아도 되는 이유
- JDBC 중복할당에 의한 WAS행(Hang)현상 추적하기
Mysql
- https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html
- https://kwonnam.pe.kr/wiki/database/mysql/jdbc
- MySQL에서는
useServerPrepStmts=true를써야 Server side cache 활성화됨 (default false)
- MySQL에서는
Fetch size
http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-implementation-notes.html
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#setFetchSize(int)
http://www.databasesandlife.com/reading-row-by-row-into-java-from-mysql/
connector 버전 5.0.2이상에서는 useCursorFetch가 먹음 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client+and+server+cursors+-+using+MySQL
autoreconnect=true
Mysql batchupdate
BLOB image 관련
기타
- [DB 가벼운 SQL 인터페이스..]
- http://java.dzone.com/articles/lightweight-sql-interfaces-jav