9

いくつかのレコードをデータベースに挿入し、いくつかのレコードを読み戻すための非常にシンプルなGUIアプリを作成しようとしています(特別なことは何もありません。3行のテーブルが1つだけで、リレーションはありません)。起源...

package EntryProg;
import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;



public class CourseDataEntryHandler
{
    private Connection connect;
    private CallableStatement callState;
    private ResultSet rSet;
    private SQLServerDataSource dSource;

    public CourseDataEntryHandler()
    {
        rSet = null;
        callState = null;

        dSource = new SQLServerDataSource();
        dSource.setUser(REDACTED);
        dSource.setPassword(REDACTED);
        dSource.setServerName(REDACTED);
        dSource.setPortNumber(REDACTED);
        dSource.setDatabaseName(REDACTED);
        dSource.setEncrypt(true);
        dSource.setTrustServerCertificate(true);
        try
        {

ここでエラー

            connect = dSource.getConnection();

終了エラー

        }
        catch (SQLServerException e)
        {
            //TODO Figure out how to handle -- logging for now, console
            do
            {
                System.out.println(e.getErrorCode());
                System.out.println(e.getMessage());
                System.out.println(e.getSQLState());
                e = (SQLServerException) e.getNextException();
            } while (e != null);
            System.out.println("END");
            System.out.println();
        }
    }

次のエラーが発生します...

(コード)0

(メッセージ)SQLServerが応答を返しませんでした。接続が閉じられました。

(状態)08S01

ユーザー、パス、サーバー名、ポート、DB名がすべて正確であることを確認しました。ユーザー名を無効なユーザー名に変更すると、「ログインできませんでした」というエラーが報告されるので、サーバーにアクセスしていることがわかります。

一度は完全に接続できなかったので、「接続が多すぎる」問題ではないことを知っています。現在サーバーにログインしているのはSQLManagementStudio経由の私だけだからです。ログアウトしても機能しないので、接続の問題ではありません。

アプリケーションユーザーには、データリーダー/データライターの権限もあります。(それが重要な場合は、Eclipseを使用しています。sqljdbc4.jarライブラリを参照しています)。

これのトラブルシューティングをどこに行けばいいのか途方に暮れています。どんな助けでも大歓迎です。

更新の編集 -接続文字列を試し、DriverManager.getConnection(connString)を使用して接続を設定しましたが、どちらも機能しませんでした。結果は同じです。また、SQL Server 2008 r2は、私が使用しているSQLServerのバージョンです。

編集 私は接続をテストするための簡単なC#プログラムを作成しました。接続が.netで正常に機能することを確認してください。残念ながら、このプロジェクトにはJavaを使用する必要があります(これはクラスで自分で行うことを選択したプロジェクトであり、要件のみです。それはJavaにあるのですか...教師は何が起こっているのか見当がつかない)。

4

2 に答える 2

15

行にコメントを付けsetEncrypt(true)ます:

...
dSource.setDatabaseName(REDACTED);
//dSource.setEncrypt(true);
dSource.setTrustServerCertificate(true);
...

暗号化の設定に問題がある可能性があります。setEncrypt(...)ドキュメントから:

暗号化プロパティがtrueに設定されている場合、Microsoft SQL Server JDBC Driverは、JVMのデフォルトのJSSEセキュリティプロバイダーを使用して、SQLServerとSSL暗号化をネゴシエートします。デフォルトのセキュリティプロバイダーは、SSL暗号化を正常にネゴシエートするために必要なすべての機能をサポートしていない場合があります。たとえば、デフォルトのセキュリティプロバイダーは、SQLServerSSL証明書で使用されるRSA公開鍵のサイズをサポートしていない場合があります。この場合、デフォルトのセキュリティプロバイダがエラーを発生させ、JDBCドライバが接続を終了する可能性があります。この問題を解決するには、次のいずれかを実行します。

  • より小さなRSA公開鍵を持つサーバー証明書を使用してSQLServerを構成します

  • 「/lib/security/java.security」セキュリティー・プロパティー・ファイルで別のJSSEセキュリティー・プロバイダーを使用するようにJVMを構成します。

  • 別のJVMを使用する

アップデート

Javaバージョン1.6.0_29および7.0.0_1で、OracleはSSL / TLS BEAST攻撃のセキュリティ修正を導入しました。これにより、まったく同じ問題が発生する可能性が非常に高くなります。上記のセキュリティ修正は、jTDSドライバーとMicrosoftドライバーの両方を使用したMSSQLServerへのデータベース接続で問題を引き起こすことが知られています。あなたはどちらかをすることができます

  • setEncrypt(true)(上記のように)使用しないことで暗号化を使用しないことを決定する
  • -Djsse.enableCBCProtection=falseまたは、MSSQL Serverによって適用されている場合は、システムプロパティを設定することで、JVMのJava修正をオフにすることができます。警告します。同じVM内のすべてのSSL接続に影響します。
于 2012-01-25T11:14:08.260 に答える
0

場合によっては、外部接続を受け入れないようにエンジン構成が変更されることがあります。いくつかの調査の後、次のことが私のために働きました:

  1. SQLServer構成マネージャーを開きます
  2. SQLSERVERネットワーク構成にアクセスする
  3. MSSQLSERVERプロトコル(ダブルクリック)
  4. TCP / IPの表示(有効にする必要があります)(開く)
  5. [IPアドレス]タブに移動します
  6. 「TCPポート」に入力:1433
  7. 有効およびアクティブ化されたオプションを有効にする必要があります:はい
  8. サービスを再開します
于 2013-04-04T20:20:13.533 に答える