繁体   English   中英

JDBC连接挂起,SQL Server 2008 r2没有响应

[英]JDBC connection hangs with no response from SQL Server 2008 r2

当连接到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 6 Update 29上运行,则升级到Java 6 Update 30或降级到Java 6 update 27(?)。 更新29包含一个错误的SSL无法正常工作,并到SQL Server挂起的连接。

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

HTH,Michal

您可以拍摄线程堆栈跟踪的快照,并查看其卡住的位置。 如果它在套接字读取 - db中的错误(我认为这将是这种情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM