전체 글 475

PreparedStatement 의 clearParameters() 는 불필요..?

하나의 PreparedStatement 로, 여러개의 쿼리를 실행(또는 하나의 쿼리로 파라미터를 바꾸면서 여러번 실행)할 때.. 이전에 세팅했던 파라미터를 모두 클리어 하는 용도입니다만.. 필요가 없을듯 하네요. 물론, 넣어도 상관은 없는데.. 동시 사용자가 갑자기 많아진다 했을 때, 이게 여러번 실행되면.. 실행되지 않았을 때에 비해 아무래도 그 만큼의 퍼포먼스를 잡아 먹게 됩니다. 물론, GC 를 위해 사용한다는 분도 있던데, 불필요한 것은 마찬가지. 기술되는 순간 시스템은 그만큼 느려진다는.. 다만, 파라미터 갯수가 바뀌는 시점에서는 사용해야 함.. ㅠ 다른 의견 있으시면, 댓글 바랍니다. #1 finally 에서 각종 요소를 초기화 할 때..? ... try{ ... }catch(Exception..

오라클 varchar2(4000) 과 한글의 오묘한 만남..?

원문1 : https://javafreak.tistory.com/98 원문2 : http://egloos.zum.com/realcool/v/2585694 SQLInjection 을 막기 위해, PreparedStatement 를 사용하는 것이 기본이겠죠. DB 칼럼에 varchar2(4000) 이 있고, 한글 2000 자를 insert 또는 update 하려 할 때.. 에러가 발생합니다, 글자를 너무 많이 입력했다공.. 이것은, 오라클이.. setString() 을 사용할 때 한글을 UTF-8 로 자동변환 하면서, 한글 1글자를 3bytes 로 인식하기 때문이라네요. 이걸 JDBC 버그라 말하기도 하는데, Statement 를 사용할 때는 setString() 으로 진행해도, 한글 2000자가 잘 들어가..

Collections 안에 다른 Collections 을 넣었을 때의 GC

* Hashtable 안에 다른 Hashtable 을 넣었을 때의 GC (List 안에 Hashtable 을 넣는 것이 바람직할듯..) Hashtable ht1 = null; Hashtable ht2 = null; try{ ht1 = new Hashtable(); ht2 = new Hashtable(); ht2.put("test2","test3"); // ht2 에는 문자열인 "test3" 세팅 ht1.put("test1, ht2); // 자, ht1 에 ht2 를 넣었으니... }catch(Exception e){ }finally{ System.out.println("+++.ht1:"+ht1); // +++.ht1:{test1={test2=test3}} // 여기서는 테스트를 위한 것이지만, 실전에선 ..

이클립스에서 Ctrl Shift R 이 작동하지 않는다..?

이클립스에서 작동하는, 다들 아는 핫키인데.. Open Resource 창이 열리면서 파일명을 입력하면 바로 찾아 주는 무시무시 한 기능인데.. 간혹 이게 작동하지 않을 때가 있어요. 보통은 SnagIt 이라는 화면 캡쳐 프로그램의 기능과 겹쳐서 작동하지 않는데.. 오늘은 AnySign4PC v1.1.2.7 때문에 발생했네요. AnySign4PC 프로그램을 삭제하고, 조금 있다가 메모리에서도 종료되면서 이클립스의 Open Resource 창을 호출하는 핫키가 작동하네요.. 나이스.. ~

Program/IDE 2022.05.17

프로시저 ... 를 사용할 수 없습니다..

프로시저 사용이 불가할 때의 메시지는, 대체로 '프로시저를 찾을 수 없습니다' 나 프로시저 ooo 에서 오류가 발생하였습니다. 그럼, '사용할 수 없습니다' 는 뭔 소리지..? 배경 설명을 해 보면, DB 사용자 A 가 만든 '프로시저A' 를, DB 사용자 B 가 '시너님A' 로 등록하여 실행해 왔던 것인데.. ('프로시저A' 는 DB 사용자 A 가 만든 '테이블A' 를 select/update/insert) DB 사용자 C 가 해당 프로시저를 컴파일 하는 시점에서 DB 사용자 B 가 만든 '시너님A' 로는 DB 사용자 C 가 컴파일한 '프로시저A' 와의 owner 관계가 끊어졌던 것. 다만, synonym 관계는 끊어지지 않음. 연결 관계가 끊어졌으면 오류 메시지가 '찾을 수 없습니다' 였을듯. '프로..

웹 화면에서 서명을 받아 서버에 업로드..

일단, 미션이 떨어지고 서명받는 방법을 찾아 보았다. canvas 라는 html 태그를 사용하여 서명받는 방법은 쉽게 찾았다.. https://szimek.github.io/signature_pad/ 그런데, 서명 받은 이미지를 서버에 업로드 해야 하는데, 상기 url 은 로컬에 다운로드 받는 내용.. 로컬에 서명한 이미지를 저장하고, 이걸 다시 찾아서 input.type="file" 에 넣는 식이면 불편. 그래서, 이리저리 찾아 보다가 서버에 업로드 하는 방법도 찾았다. http://hacks.mozilla.or.kr/2011/01/html5-이미지-업로더-개발-방법 그런데, multipart/form-data 를 이용한 방법을 고집해서, form 태그의 input type="file" 에 넣으려고 하..

ORA-22990: LOB 위치는 트랜잭션을 걸칠 수 없습니다

LOB(Longraw, Blob, Clob) 등을 select ... for update 등등의 방법으로 DB 에 넣으면서 Stream 을 flush() 할 때.. 아래와 같이, flush() 가 commit() 뒤에 존재하면 오류. try{ ... conn.commit(); }catch(Exception e){ ... }finally{ ... stream.flush(); } 예외 상황이 발생하더라도 flush() 하고자 finally 에 넣겠다는 의도였겠지만.. DB 상의 LOB 처리시에는 try 문 안에서 flush() 한 다음 commit() 하고 finally 에서 close() 하는 것이 맞음.

PreparedStatement SQL 문에 ? 를 적용할 수 없는 것

이를테면, String sql = "select no, name from table_name where no = '32' "; 라는 쿼리가 있다고 하자(물론, 정상 작동한다고 가정한다).. 우리가 익히 보아 온 PreparedStatment 의 SQL 문은 아래와 같은 것이다. String sql = "select no, name from table_name where no = ? "; 그러면, DB table 의 column 명 대신에 ? 를 아래와 같이 사용해 보면 어떨까? String sql = "select no, name from table_name where ? = ? "; 예외를 throw 하지도 않으면서 에러가 난다.. try ~ catch 에 잡히지도 않는다. 이제, DB table 명 ..