这是我的设置。在虚拟机 (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() 时 servlet 停止。我通过删除(注释掉)部分代码将其范围缩小到这一点,这表明它将创建一个连接(DriverManager.getConnection..)并准备语句。只有在添加 pstm.executeQuery() 时,servlet 才会响应。
我使用 Microsoft 的 JDBC 连接器,该 jar 可用于独立 java 和 servlet。我没有任何异常来帮助找到错误。
真正让我感到困惑的是,它会建立连接,但不会执行查询。非常欢迎所有建议。