【问题标题】:JDBC connection hangs with no response from SQL Server 2008 r2JDBC 连接挂起,没有来自 SQL Server 2008 r2 的响应
【发布时间】:2012-02-17 16:06:33
【问题描述】:

当连接到 SQL Server 2008(本地表示,生产中的完整服务器)时,这在我的本地计算机上开发时对我来说很好,但这只是在生产中挂起。

代码如下:

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 -jar ipaddress port dbname 用户密码

有什么想法吗? SQL驱动程序错了吗?我正在使用 sqljdbc4.jar

生成的命令提示符是...

初始化变量 打开记录器... Driver Manager.getConnection...

不会抛出异常

谢谢,

D

【问题讨论】:

  • 挂在哪里?你能插入更多的日志语句来追踪导致它挂起的行吗?
  • 更新了代码以具有系统输出并抛出消息,但永远不会抛出异常。

标签: java sql-server jdbc


【解决方案1】:

我在 MS SQL Server 2012 + JDBC 4.0 驱动程序中遇到了同样的问题,JDK 6.0 更新 29 再次成为问题。在发出任何查询之前,第一次调用 executeQuery() 或什至使用 setAutoCommit(false) 时连接挂起。更新到 JDK 6.0 update 37 后一切正常。

HTH, 迈克尔

【讨论】:

    【解决方案2】:

    如果生产在 Java 6 Update 29 上运行,则升级到 Java 6 Update 30 或降级到 Java 6 Update 27(?)。更新 29 包含 a bug,其中 SSL 无法正常工作并且与 SQL Server 的连接挂起。

    【讨论】:

      【解决方案3】:

      您可以对线程堆栈跟踪进行快照,然后查看卡在哪里。如果它在套接字读取中 - 数据库中有问题(我认为这里就是这种情况)。

      【讨论】:

      • 你好,对不起,你如何查看单线程的异常,在应用程序中不会异常吗?
      • 嗨,不。它本身并不是一个例外,它是一个线程转储。它可以按线程生成。在 java 中,它可以通过或以编程方式完成(Thread.currentThread().getStackTrace(),系统中的所有线程也有一个方法)或来自 JConsole
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多