CLOB DATA는 JDBC Driver 나 POOL Manager의 종류에 따라 처리 방법이 약간씩 상이한 부분이 있다.
이번 기회에 이때까지 플젝에서 사용했던 방법과 인터넷(블로그,자바커뮤니티사이트) 서치 내용을 종합하여 실제로 동작한 경우만을 간단히 정리하여 매번 고생하지 않도록 ....
CLOB DATA DB 입력하자.
1. 일반적인 JDBC 연결시
① Connection 객체 setAutoCommit(false) 로 세팅
② Clob 칼럼을 empty_clob()으로 인서트 또는 업데이트
③ SELECT clob칼럼 FROM ~~ FOR UPDATE
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.CLOB;
~~~~
OutputStream os = null;
~~~~~
if(rs.next()) {
CLOB clob = ((OracleResultSet)rs).getCLOB(1);
os = clob.getAsciiOutputStream();
os.write(message.getBytes());
os.flush();
os.close();
}
위와 유사하고 Buffered IO를 추가하고 getCharacterOutputStream을 이용한 것이 차이남
import oracle.jdbc.OracleResultSet;
import oracle.sql.CLOB;
~~~~~
BufferedWriter writer = null;
if (rs. next()) {
CLOB clob = ((OracleResultSet)rs).getCLOB("CONTENT");
writer = new BufferedWriter(clob.getCharacterOutputStream());
writer.write(str);
writer.close();
writer = null;
}
역시 위와 유사하고 까오기 사이트에서 사용된 예제이다.
if(rs.next()) {
CLOB clob = ((OracleResultSet)rs).getCLOB(1);
Writer writer = clob.getCharacterOutputStream();
Reader src = new CharArrayReader(up.getContent().toCharArray());
char[] buffer = new char[1024];
int read = 0;
while ( (read = src.read(buffer,0,1024)) != -1) {
writer.write(buffer, 0, read); // write clob.
}
src.close();
writer.close();
}
또 다른 방법으로는 putString 메소드를 이용하는 방법(코딩 라인수가 적어서 내가 주로 쓰는 방법)
import oracle.jdbc.OracleResultSet;
import oracle.sql.CLOB;
~~~
CLOB clob=null;
if (rs.next()) {
clob = ((OracleResultSet)rs).getCLOB(1);
long pos = 1;
clob.putString(pos,s);
}
④ Connection객체를 commit한다.
2. WEBLOGIC Console에 세팅된 DataSource와 POOL에서 불러오는 경우
☞ 이렇게 사용되는 경우에 제대로 동작하는 것을 확인
(Buffered IO나 getCharacterOutputStream으로 바꿀수도 있을 것 같다.)
OutputStream os = null;
~~~~~
java.sql.Clob clob = rs.getClob(1);
os = ((weblogic.jdbc.common.OracleClob)clob).getAsciiOutputStream(); //----> 중요
os.write(message.getBytes());
os.close();
3. TOMCAT DBCP로 세팅된 DataSource를 불러오는 경우
☞ 이번에 피를 마르게 했던 경우인데 알고나니 엄청 간단함.
여기서 CLOB clob = ((OracleResultSet)rs).getCLOB(1); //---->ClassCastException발생
import oracle.sql.CLOB;
BufferedWriter writer = null;
if (rs. next()) {
CLOB clob = (CLOB)rs.getObject("CONTENT"); //------>중요
writer = new BufferedWriter(clob.getCharacterOutputStream());
writer.write(str);
writer.close();
writer = null;
}
CLOB DATA DB에서 조회하자.(대부분 유사)
SELECT CLOB칼럼 FROM ~~~~ 에 대한 RESULTSET
☞ 내가 주로 사용하는 방법이고 일반적으로 사용되는 방법
String sClob = null;
StringBuffer output = new StringBuffer();
if(rs.next()) {
Reader input = rs.getCharacterStream(1);
char[] buffer = new char[1024];
int byteRead;
while((byteRead=input.read(buffer,0,1024))!=-1)
{
output.append(buffer,0,byteRead);
}
input.close();
sClob = output.toString()
}
☞ 동작 확인한 소스이므로 이렇게도 가능한 것 같음...
java.sql.Clob clob = rs.getClob(5);
String value = "";
InputStream is = null;
byte[] b = new byte[(int)clob.length()];
is = clob.getAsciiStream();
is.read(b);
value = new String(b);
그외 TOMCAT DBCP의 경우 server.xml를 바꾸서 해결한 경우를 봤는데
(DBCP를 사용하지 않게 되므로 근본적인 해결은 아닌 듯.....)
<Context path="" docBase="TEST" debug="0" reloadable="true" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_test_log." suffix=".txt"
timestamp="true"/>
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/nsdb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
여기서는 CLOB clob = ((OracleResultSet)rs).getCLOB(1); //---->ClassCastException발생
--> 아래와 같이 해서 아예 DBCP를 사용하지 않는 경우는
<Context path="" docBase="TEST" debug="0" reloadable="true" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_test_log." suffix=".txt"
timestamp="true"/>
<Resource name="jdbc/test" auth="Container" type="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
<ResourceParams name="jdbc/nsdb">
<parameter>
<name>factory</name>
<value>oracle.jdbc.pool.OracleDataSourceFactory</value>
</parameter>
여기서는 CLOB clob = ((OracleResultSet)rs).getCLOB(1); //---->정상 작동