Jan 29 2008

2008 JCO 한국 자바 개발자 컨퍼런스

분류: Dev.Info 태그: ,, , Heart @ 5:12 오후

Trackback : http://dev.heartsavior.net/archives/59/trackback/

이번년도에도 하는구나…
작년 오픈소스 컨퍼런스때는 조금 아쉬움이 남았지만, 이번에는 트랙도 5개나 되고 일단 세션(시간) 당 듣고 싶은 게 하나씩은 꼭 있어서 괜찮은 시간이 될 것 같다.

별 일 없으면 꼭 가야지.

ps. 음… 하지만 기조연설은 Pass…-_-;; 저번에 솔직히 좀 후회했음.

ps2. 책 값은 매번 비싸지는 듯…-_-;; 트랙 * 세션 수가 하도 많다보니 종이값도 꽤 드나보다. 그냥 선 프린트하게 해 주면 안되나;;


Jan 15 2008

MSDN KB : Windows Service는 네트워크 드라이브 매핑(WNet API)을 사용하지 말고 UNC 이름(경로)을 이용하라

분류: Tip.Tech 태그: ,, , , Heart @ 1:40 오전

Trackback : http://dev.heartsavior.net/archives/60/trackback/

네이버 검색 - 구글링 - 데브피아 검색 - MSDN 검색 등을 하면서 찾은 자료…

2006년 하반기 자료
@ INFO: Services and Redirected Drives from MSDN

최신 버전의 자료
@ Services and Redirected Drives from MSDN

윗 자료에서 SUMMARY 부분만 번역하자면…

서비스는 매핑된 드라이브 레터로 로컬/네트워크 자원을 액세스하면 안되며, WNet API로 매핑된 드라이브 레터를 추가/삭제/질의하면 안된다. 혹여 결과값이 성공으로 리턴되더라도 잘못된 실행 결과가 일어난다.
네트워크 자원을 반드시 액세스해야 하는 서비스의 경우에는 UNC 이름을 통해 자원에 액세스할 수 있다. UNC 이름은 문서에 기술된 제한들을 받지 않는다.

이후의 내용을 ‘대충’ 살펴봤더니(WNet API로 드라이브 레터에 손댈 수 있다는 문서였다면 자세히 봤겠지만…)
XP부터 로그온 세션마다 드라이브 레터가 다르게 할당되기 때문인 것 같다. 서로 건들수도 없는듯…

혹시나 다른 방법이 있을까 해서 좀 더 찾아봤는데, 서비스에서 유저 레벨로 프로세스를 실행하는 방법에 대한 자료는 좀 있는 것 같다.

@ Re: Calling CreateProcessAsUser() from service

@ 서비스(SCM) 프로그램에서 시스템계정관련과 레지스트리

하지만, 프로세스를 유저 레벨로 실행할 때 로그온 세션까지 지원되는지는 해보기 전에는 확인할 수 없고(자료의 예시중에 드라이브 매핑이 없네…) 게다가 내가 원하는 것은 서비스 자체에서 네트워크 드라이브를 사용하는 것이었으니… 활용하기는 좀 어렵다고 봐야 될 것 같다.

Java 데몬을 서비스단으로 올리고 JNI를 통해 WNet API를 끌어써서 네트워크 공유 폴더를 드라이브 매핑해서 쓰겠다는 ‘나름 치밀한’ 계획이었는데… ‘서비스단’ 만 빼고는 테스트까지 끝났구만 귀찮게 됐네… 쩝…


Jan 10 2008

Java SE 6.0 + jTDS 1.2 + MS-SQL(SQLServer) 2000 + BLOB(image) 예외 발생하면 확인해봐야 할 것

분류: Open.Library 태그: ,, , , , Heart @ 10:05 오후

Trackback : http://dev.heartsavior.net/archives/61/trackback/

Java SE 6.0 + jTDS 1.2 + MS-SQL(SQLServer) 2000 + BLOB(image) + File 객체 사용 시에 주의해야 할 점이다.

아래는 파일 내용을 그대로 MS-SQL DB에 기록하는 코드… 뭐, 이정도면 되겠지?

첫 시도

FileInputStream fis = null;
File f = new File(path);
fis = new FileInputStream(f);

pstmt = prConn.prepareStatement(query);
pstmt.setBinaryStream(1, fis);          // Error!!!

int nCount = pstmt.executeUpdate();

Exception in thread “main” java.lang.AbstractMethodError:
net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

엇? AbstractMethodError 예외가 발생… 음… 길이를 지정해볼까?

두번째 시도

pstmt.setBinaryStream(1, fis, f.length());          // Error!!!

마찬가지로 같은 예외가 발생…

구글링으로도 관련 자료를 못 찾았는데, 지푸라기라도 잡는 심정으로 jTDS 포럼을 들어가서 수 차례 검색해 본 결과 관련 자료를 찾을 수 있었다.

@ RE: pst.setBinaryStream error By: Mike Hutchinson

내용을 요약하자면, setBinaryStream()의 3번째 인자가 long인 것은 JDBC 4 이고, J2SE 6.0은 JDBC 4를 지원하는데 jTDS의 현재 버전은 JDBC 3을 구현했다는 것이다.
즉, 위의 예외는 구현되지 않은 메소드가 호출되었을 때 발생하는 것이고, JDBC 3 에서 지원하는 setBinaryStream() 은 3번째 인자가 int 이다.

그래서 수정한 버전…

pstmt.setBinaryStream(1, fis, (int)f.length());      // OK!!!

아주 잘 입력된다.

jTDS 가 구현한 JDBC 버전과, JDBC 버전간의 차이를 알아야 문제의 원인 및 해결 방안을 찾을 수 있는 문제인데, 덕분에 쉽게 헤쳐나가서 다행이다. Know-Where의 중요성을 다시 한 번 실감한 날이랄까?