2012-01-24 22 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でハングアップするようだが、他のすべての顧客のために本番環境で正常に動作する。 ...

SQL Serverの1433でTCP/IPが有効になっており、管理コンソールでリモート接続がtrueに設定されていることを許可します。

javaの任意のアイデアIPアドレス、ポートdbnameはユーザのパスワード

-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(?)にダウングレードします。 Update 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、 Michal

関連する問題