2012-01-24 3 views
4

SQL Server 2008에 로컬로 연결하면 로컬 컴퓨터에서 개발할 때이 기능이 정상적으로 작동하지만 프로덕션 환경에서만 중단됩니다. 실행됩니다 코드의 그SQL Server 2008 R2에서 응답없이 JDBC 연결이 끊어집니다.

package oata; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import sun.applet.Main; 

public class Sql { 

    public static final String SQLDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 
    protected Connection conn = null; 
    private String ip = ""; 
    private int port = 0; 
    private String databaseName = ""; 
    private String db_userid = ""; 
    private String db_password = ""; 

    public void callDb(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{ 
     System.out.println("Initialising variables"); 
     ip = args[0]; 
     port = Integer.parseInt(args[1]); 
     databaseName = args[2]; 
     db_userid = args[3]; 
     db_password = args[4]; 
     try{ 
     Log logger = LogFactory.getLog(Main.class); 
     System.out.println("Opening logger..."); 
     logger.debug("opening driver " + SQLDRIVER); 
     System.out.println("Creating connection instance..."); 
     Class.forName(SQLDRIVER).newInstance(); 
     System.out.println("Driver Manager.getConnection..."); 
     conn = DriverManager.getConnection(getDBURL(), db_userid, db_password); 
     System.out.println("Connection prepare statement..."); 
     PreparedStatement ps = conn.prepareStatement("select * from nstupersonal"); 
     System.out.println("Executing query..."); 
     ResultSet rs = ps.executeQuery(); 
     while(rs.next()){ 
      System.out.println(rs.getString("StudentId")); 
     } 
     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 

     conn.close(); 
    } 


    private String getDBURL(){ 
       String url = ""; 
       try { 
        url = "jdbc:sqlserver://" + ip 
        +":" + port +";databaseName="+ 
        databaseName + ";user=" + db_userid + ";password="+db_password; 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return url; 
      } 

} 

: 여기

는 코드입니다. 콘솔에서는 글자 그대로 프로덕션에 매달려 있습니다. 항상 SQL Server 2008에 매달려 있지만 다른 모든 고객을 위해 제대로 작동합니다. sim30ly와 함께 실행됩니다.

SQL Server의 1433에서 TCP/IP가 사용되며 관리 콘솔에서 원격 연결이 true로 설정됩니다. 포트 DBNAME 사용자 암호

어떤 아이디어를 IPADDRESS -jar

자바? SQL 드라이버가 잘못 되었습니까? 나는 sqljdbc4.jar

결과 명령 프롬프트는 ...

초기화 중 변수 열기 로거 ... 드라이버 Manager.getConnection ... 어떤 예외가 발생하지 도착

을 사용하고

감사합니다,

D

+0

어디이 중단합니까? 더 많은 로깅 구문을 삽입하여 줄을 매기는 줄을 추적 할 수 있습니까? – beny23

+0

System out 및 throw 메시지를 포함하도록 코드가 업데이트되었지만 예외가 발생하지 않습니다. – david99world

답변

11

프로덕션이 Java 6 Update 29에서 실행 중이면 Java 6 Update 30으로 업그레이드하거나 Java 6 Update 27 (?)으로 다운 그레이드하십시오. 업데이트 29에는 a bug이 포함되어 있으며 SSL이 올바르게 작동하지 않으며 SQL Server 연결이 중단됩니다.

+0

감사합니다! 이것은 그 것이었다! – david99world

1

당신은 당신의 스레드 STAC의 스냅 샷을 캡처 할 수 있습니다 k 개의 흔적을 발견하고 어디서 붙어 있는지 봅니다. 그것의 소켓 읽기 - 뭔가 DB에 잘못 (나는 이것이 여기에있을 것이라고 생각).

+0

안녕하세요, 미안 해요, 당신은 어떻게 하나의 스레드의 예외를 볼 수 있습니까, 그것은 응용 프로그램에서 예외가 아니겠습니까? – david99world

+0

안녕하세요. 그 자체가 예외는 아니며 스레드 덤프입니다. 스레드마다 생성 될 수 있습니다. java에서는 프로그래밍 방식으로 (Thread.currentThread(). getStackTrace(), 시스템의 모든 스레드에 대한 메서드가 있음) 또는 JConsole에서 –

1

MS SQL Server 2012 + JDBC 4.0 드라이버에서 동일한 문제가 발생했으며 다시 JDK 6.0 업데이트 29가 문제가되었습니다. 쿼리가 실행되기 전에 executeQuery()를 처음 호출하거나 setAutoCommit (false)을 사용하여 연결이 중단되었습니다. JDK 6.0 업데이트 37로 업데이트하면 모두 정상적으로 작동합니다.

HTH, 마이클

관련 문제