안녕하세요, 김일형입니다.
그리 경험이 많지 않아서 님의 설명과 프로그래머 매뉴얼을 보고 테스트를 해봤는데...
ps.setBinaryStream(2, fis, (int)file.length());
정확하게 여기서 예외가....
InputStream을 매개변수로 사용할 수 없다는 충격적인....
매뉴얼에도 분명되는 것으로 나오는데...말이죠...
단 한가지 님이 잊고 넘어가신 것은 ....
---------------------------------------------------------------------------
Important: For Postgres, you must access Large Objects within an SQL transaction. You would open a transaction by using the setAutoCommit() method with an input parameter of false:
Connection mycon;
...
mycon.setAutoCommit(false);
... // now use Large Objects
----------------------------------------------------------------------------
라고 매뉴얼에 나왔있슴당.... 거대객체는 SQL 트랜젝션 내에서만 이루어져야 한다는 것인데... 그러니가 제생각에는 커넥션을 얻은 다음에는 Auto Commit을 중지 시켜야한다는 것이죠.
그런데 그렇게 해도 여전히 예외가 떨어지던데요.... -__-;;;;
제가 시간이 없어서 오랫동안 삽질을 해보지는 않았는데요... 한번 계속 디벼보겠습니다.
죄송합니다. 도움이 못되어드려서...
김일형.
>>안상훈 님께서 쓰시길<<
:: 사용환경은
:: * Alzza Linux Kernel 2.2.12
:: * JDK1.3
:: * Postgresql7.1.2
::
:: 이렇게 설정되어 있습니다. 이중 large object를 사용하는 message라는 테이블구조는 아래와 같습니다.
::
::
:: CREATE TABLE message (
:: mid int PRIMARY KEY,
:: message oid
:: );
::
:: 여기서 Postgres.org 홈페이지에 있는 JDBC를 이용한 large object를 사용하는 샘플코드를 사용해 봤
:: 는데 실행시 에러가 납니다. 에러는 다음과 같습니다.
::
:: Connection successful!
:: InputStream as parameter not supported
:: at org.postgresql.jdbc2.PreparedStatement.setBinaryStream(PreparedStatem
:: ent.java:476)
:: at test.main(test.java:37)
::
:: 너무 안되어서 현재 개발버전인 7.2로도 테스트 해보았으나 마찬가지 에러가 납니다. 제가 작성한 샘
:: 플코드는 아래와 같습니다.
::
:: class test {
:: public static void main (String args[]) {
:: Connection connection = null;
::
:: File file;
:: FileInputStream fis;
::
:: try {
:: file = new File("headcut.jpg");
:: fis = new FileInputStream(file);
:: } catch (Exception e) {e.printStackTrace(); return;}
::
:: try {
:: Class.forName ("org.postgresql.Driver");
:: connection = DriverManager.getConnection("jdbc:postgresql:jdbcdb", "postgres", "
:: postgres");
:: System.out.println ("Connection successful!");
:: PreparedStatement ps = connection.prepareStatement("INSERT INTO message VALUES (
:: ?, ?)");
:: ps.setInt(1, 1000);
:: ps.setBinaryStream(2, fis, (int)file.length());
:: ps.executeUpdate();
:: ps.close();
:: } catch (Exception e){
:: e.printStackTrace();
:: return;
:: }
:: }
:: }
::
:: 아직 JDBC에서 지원이 안되는 것인가요? JDBC는 postgresql소스를 컴파일해서 얻었습니다. 여러 고수
:: 님들의 조언 부탁드립니다.
::
:: 감사합니다.
::
|