none
MS-SQL 2005 jdbc 사용 시 발생문제 RRS feed

  • 질문

  • 안녕하세요. 저희가 이번에 사이트 OPEN을 준비하고 있습니다.

     
    언어 : JSP 5.0
    db : MS-SQL2005
    web server : webtob4.1
    was : jeus5
     
    로 이루어진 사이트 입니다.
     
    MS 사에서 얼마전 배포한 ms-2005용 JDBC(sqljdbc.jar)를 가지고 was의 pooling 을 생성하여 db 커넥션을 만들어 테스트를 진행하던 중 이상한 점이 발견되어 이렇게 문의 메일을 보내게 되었습니다.
     
    처음 사이트 접속을 하면 정상적으로 됩니다.
     
    그러다 db와 접속하는 페이지 접속을 하면 500에러(DB연결 끊겨 원하는 데이터를 못 가져와서 생기는 에러)가 떨어 집니다.
     
    그 상태에서 새로고침(F5)을 하면 다시 정상적으로 DB연결이 되어 서비스를 실행 합니다.
     
    또 다시 새로고침(F5)을 하면 전과 같은 500에러가 발생됩니다.
     
    또 한번 새로고침(F5)을 하면 다시 정상적으로 서비스가 됩니다.
     
    이 상태가 딱 1:1의 비율로 발생되고 있습니다.
     
    그래서 현재 ms-2000 jdbc 드라이버를 이용하여 pooling 을 생성하여 테스트를 진행하고 있는데 mssql-2000 jdbc 드라이버를 이용하여 mssql-2005에서 서비스를 진행해도 되는지도 의문입니다.
     
    보시고 답변이나 전화를 부탁드립니다.
     
    500 에러 시 WAS에 발생된 오류로그는 아래와 같습니다.
    ------------------------------------------------------------------------------------------------
    com.microsoft.sqlserver.jdbc.SQLServerException: 서버에서 트랜잭션을 재개하지 못
    했습니다. 설명:  3a00000004.
           at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError
    (Unknown Source)
           at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source)
           at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown
    Source)
           at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Un
    known Source)
           at com.microsoft.sqlserver.jdbc.SQLServerStatement$StatementExecutionReq
    uest.executeStatement(Unknown Source)
           at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source
    )
           at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unkno
    wn Source)
           at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown
    Source)
           at db.DHandle_MS.setSQL(DHandle_MS.java:787)
           at jeus_jspwork._edi._kccwf_5fedi._gumgo_5fstatistics._500_gs0202_5fsta_
    5ftop_5fjsp._jspService(_500_gs0202_5fsta_5ftop_5fjsp.java:222)
           at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:53)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
           at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.j
    ava:94)
           at jeus.servlet.servlets.JspServlet.execute(JspServlet.java:359)
           at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor
    .java:180)
    2007년 7월 5일 목요일 오전 2:54

모든 응답

  • Microsoft SQL Server 2005 JDBC Driver 1.1 로 테스트한건가요?

    http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=6d483869-816a-44cb-9787-a866235efc7c

    개요

    상호 운용성에 대한 설명에서, Microsoft는 SQL Server 2005와 사용할 수 있도록 JDBC(Java Database Connectivity) 드라이버를 제공합니다.
    모든 SQL Server 사용자는 추가 비용을 지불하지 않고 SQL Server 2005 JDBC 드라이버를 사용할 수 있으며,
    모든 Java 응용 프로그램, 응용 프로그램 서버 또는 Java를 사용할 수 있는 애플릿에서 SQL Server 2000 및 SQL Server 2005에
    액세스할 수 있습니다. 이 드라이버가 J2EE(Java2 Enterprise Edition)에서 사용할 수 있는 표준 JDBC API
    (응용 프로그램 인터페이스)를 통해 데이터베이스 연결을 제공하는 4유형의 JDBC 드라이버입니다.

    SQL Server 2005 JDBC Driver 1.1은 JDBC 3.0과 호환되며 JRE(Java Runtime Environment) 버전 1.4 이상에서 실행됩니다.
    이는 BEA WebLogic, IBM WebSphere, JBoss 및 Sun을 포함한 모든 주요 응용 프로그램 서버에서 테스트되었습니다.


     
    아래코드를  Application 에 적용하면 사용하는  JDBC 드라이버의 버젼을 확인할수 있습니다. 버젼이 1.0 이라면 1.1로 적용하신후 재테스트를 해보시기 바랍니다.
    (현재 1.2 CTP까지 나와있습니다)
     
    Connection conn = DriverManager.getConnection("jdbcTongue Tiedqlserver://" + server,
    user, pword);
    DatabaseMetaData dbmd = conn.getMetaData();
    System.out.println("Driver Version: " + dbmd.getDriverVersion());
    System.out.println("Server Version: " + dbmd.getDatabaseProductVersion());
    2007년 7월 6일 금요일 오전 2:15
  • Statement object를 이용하여 쿼리 수행시 '서버에서 트랜잭션을 재개하지 못했습니다' 오류가 발생과 관련된

    MS SQL Server 2005 JDBC Driver 의 알려진 이슈가 있습니다. (JDBC 1.2에서 FIX될 예정임)

    이에 우선적으로 아래 Workaround로 문제가 해결되는지 체크가 필요할 것으로 보입니다.

     

    JDBC 1.1에서 위 문제를 피하시려면 다음의 WORKAROUND를 사용하시면 됩니다.

     

    1) Statement 대신 PreparedStatement  사용

     

    또는,

     

    2) Statement.getMoreResults() 및 Statement.getUpdateCount() 를 이용해 모든 Recordset이 처리되도록 코드 수정

     

    sample code는 다음과 같습니다.

     

    Statement stmt = conn.createStatement();
    stmt.execute("exec testProcReturns");
    int resultSetNum = 0;
    for (boolean resultsEndOrUpdateCount = false;
    ;
    resultsEndOrUpdateCount = !stmt.getMoreResults())
    {
    if (resultsEndOrUpdateCount)
    {
    int updateCount = stmt.getUpdateCount();
    if (-1 == updateCount) // end of results
    break;

    System.out.println("Update count is: " +
    updateCount);
    }
    else // result is ResultSet
    {
    ResultSet rs = stmt.getResultSet();

     

    System.out.println("Found a
    result set");
    while (rs.next())
    {

    System.out.println("ResultSetValue: " + rs.getString(1));
    }


    rs.close();
    }
    }

    stmt.close();

     

    감사합니다

    박 상 준

    2007년 7월 26일 목요일 오전 4:36
  • WAS 설정 상에 "전역(XA) 트렌젝션 지원" 에 대한 옵션이 있는지 한번 확인 해보세요.

    2017년 4월 12일 수요일 오전 2:42