제목
요약
JDBC의 몇 가지 확장 기능을 제공한다.
Class.forName("kr.xdbc.driver.GenericDriver"); Connection con = DriverManager.getConnection( "xdbc:jdbc:postgresql://localhost/memo", "postgres", "password" ); con.close();
<Resource name="jdbc/memo" auth="Container" type="javax.sql.DataSource" driverClassName="kr.xdbc.driver.GenericDriver" url="xdbc:jdbc:postgresql://localhost/memo" username="postgres" password="password" />
$JAVA_HOME/jre/lib/logging.properties 파일을 약간 수정한다.
.level= FINEST java.util.logging.ConsoleHandler.level = FINEST
Apache Ant의 java task 를 사용하는 경우 다음과 같은 내용도 추가한다(그렇지 않았다면 너무 많은 로그가 출력될 것이다).
java.level = WARNING javax.level = WARNING sun.level = WARNING
handlers= java.util.logging.ConsoleHandler .level= FINEST java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter java.level = WARNING javax.level = WARNING sun.level = WARNING kr.xdbc=FINEST
java -Djava.util.logging.config.file=logging.properties YourClassName
<java classname="YourClassName" fork="true"> <jvmarg value="-Djava.util.logging.config.file=logging.properties" /> </java>
첫 번째 줄은 ALL 혹은 FINEST 으로 변경한다.
java.util.logging.ConsoleHandler.level = ALL
마지막 부분에 다음과 같은 내용을 추가한다.
kr.xdbc.level = FINEST
다음과 같이 | 를 구분자로 해서, 여러 데이타베이스를 지정한다.
xdbc:jdbc:postgresql://192.168.2.2/memo|jdbc:postgresql://192.168.2.3/memo2
데이타베이스 연결이나 커서를 열면, 그 당시의 StackTrace를 저장했다가, close 메소드가 호출되면 이를 삭제함으로서, 일정 시점에 현재 실행중인 StackTrace를 확인할 수 있고, 이를 통해 실수로 close 메소드 호출이 누락된 코드를 찾을 수 있다.
관리되는 class 는 다음과 같다.
먼저 trace 모드를 활성화시켜야 한다.
kr.xdbc.trace.ConnectionManager.getInstance().start();
web.xml 에 다음과 같은 내용을 추가하면, context 가 초기화 될 때, trace 를 자동으로 시작한다.
<listener> <listener-class>kr.xdbc.servlet.ConnectionManagerListener</listener-class> </listener>
trace 모드를 비활성화시키기 위해서는 다음과 같이 한다.
kr.xdbc.trace.ConnectionManager.getInstance().end();
다음과 같이 저장되어 있는 StackTrace를 출력할 수 있다.
kr.xdbc.trace.ConnectionManager.getInstance().trace(System.out);
trace 메소드는 java.io.Writer나 java.io.PrintStream 파라미터를 입력받는다.
파일에 쓰고 싶은 경우 다음과 같다.
java.io.PrintStream ps = new java.io.PrintStream("/var/lib/tomcat9/logs/status.out"); kr.xdbc.trace.ConnectionManager.getInstance().trace(ps); ps.close();
jsp에서는 다음과 같이 할 수도 있다.
kr.xdbc.trace.ConnectionManager.getInstance().trace(out);
DO $$ DECLARE r record; mx integer; BEGIN FOR r IN ( select relname, substr(relname, 0, strpos(relname, '$')) as table_name, substr(relname, strpos(relname, '$')+1) as column_name from pg_statio_all_sequences where relname like '%$%' ) LOOP execute 'select max(' || r.column_name || ') + 1 as mx from ' || r.table_name || '' into mx ; execute 'alter sequence "' || r.relname || '" restart with ' || mx ; END LOOP; END $$;
try { Class.forName("org.h2.Driver");} catch(ClassNotFoundException e) {}
kr.xdbc.driver.GenericDriver 는 Java 7 을 위한 것과 Java 8 을 위한 것이 각각 있다는 사실에 주의하라.