0

これが私のセットアップです。仮想マシン (Fusion) で MSSQL Server Express 2012 を実行します。仮想マシンは OS X Lion Server で実行されます。OS X Lion では、Tomcat 7 サーバーが実行されています。スタンドアロンの Java から次のコードを試します。

static {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private final static String host = "ip-address:1433";
private final static String database = "databasename";
private final static String user = "user";
private final static String passwd = "password";

public static void main(String[] args) {
    try {
        String connectionUrl = "jdbc:sqlserver://"+host+";database="+database+";integratedSecurity=true;";
        Connection con = DriverManager.getConnection(connectionUrl,user,passwd);
        PreparedStatement pstm = con.prepareStatement("select * from sektor");
        ResultSet res = pstm.executeQuery();
        while(res.next())
            System.out.println("Sektor: " +res.getString("sektornavn"));
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

これはうまく機能し、期待どおりにテーブルの内容を出力します。同じコードを使用するようになりました (出力を system.out からの応答に変更するだけです)。

static {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private final static String host = "ip-address:1433";
private final static String database = "databasename";
private final static String user = "user";
private final static String passwd = "password";


@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/plain");
    resp.setCharacterEncoding("UTF-8");
    // Write response
    PrintWriter writer = resp.getWriter();
    try {
        String connectionUrl = "jdbc:sqlserver://"+host+";database="+database+";";
        writer.println("Connecting<br/>");
        Connection con = DriverManager.getConnection(connectionUrl,user,passwd);
        writer.println("Preparing statement<br/>");
        PreparedStatement pstm = con.prepareStatement("select * from sektor");
        writer.println("Executing statement<br/>");
        ResultSet res = pstm.executeQuery();
        while(res.next())
            writer.println("Sektor: " +res.getString("sektornavn")+"<br/>");
    } catch (SQLException e) {
        writer.println(e.getMessage());
    }
    writer.flush();
    writer.close();

}

私が抱えている問題は、pstm.executeQuery() に到達するときにサーブレットが停止することです。コードの一部を削除 (コメント アウト) することで、ここまで絞り込みました。これは、接続 (DriverManager.getConnection..) を作成し、ステートメントを準備することを示しています。pstm.executeQuery() を追加する場合のみ、サーブレットは応答しません。

私は Microsoft の JDBC コネクタを使用しており、jar はスタンドアロン Java とサーブレットの両方で使用できます。エラーを見つけるのに役立つ例外はありません。

私を本当に困惑させているのは、接続を取得するが、クエリを実行しないことです。すべての提案は大歓迎です。

4

1 に答える 1

0

それが役立つかどうかわかりませんが、JTDS jdbc ドライバーの使用を検討しましたか? jtds ドライバーをしばらく使用していますが、MS jdbc ドライバーよりも問題が少ないことがわかりました。MSドライバーを使って説明できない奇妙なことが起こったことがあります。

于 2012-05-25T11:52:31.227 に答える