これが私のセットアップです。仮想マシン (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 とサーブレットの両方で使用できます。エラーを見つけるのに役立つ例外はありません。
私を本当に困惑させているのは、接続を取得するが、クエリを実行しないことです。すべての提案は大歓迎です。