JDBC - Windows 上的连接极慢,Linux 上的连接速度很好

JDBC - Connection extremely slow on Windows, Fine on Linux

使用 JDBC 连接到 Windows Server 2008 计算机上的 SQL 服务器,我 运行 陷入了一个极其混乱的问题。

虽然它在我的 Linux 笔记本电脑上运行良好,同时使用 Microsoft 的 JDBC 驱动程序和 jTDS,但当我将应用程序移动到 Windows 运行 时,它运行得非常慢设备执行单个 SQL 命令需要 4 到 10 秒!

我尝试了以下所有连接数据库服务器的技术,几乎所有技术在 Linux 上都很快,而在 Windows 上非常慢。使用 jTDS 数据源,我了解到它在 Windows 8 上运行良好,但当我将代码移至计算机 运行 数据库本身(windows 服务器)时总是很慢。

// =============== jTDS

    JtdsDataSource ds = new JtdsDataSource();

    ds.setUser(DB_USERNAME);
    ds.setPassword(DB_PASSWORD);
    ds.setServerName(SERVER_ADDRESS);
    ds.setPortNumber(SERVER_PORT);
    ds.setDatabaseName(DATABASE_NAME);
    ds.setLoginTimeout(server.SQL_LOGIN_TIMEOUT);

    try {
        _conn_ = ds.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }


    // =============== Microsoft

    try {

        String connectionUrl =
                String.format("jdbc:sqlserver://%s:%d;" +
                "databaseName=%s;" +
                "ssl=require", SERVER_ADDRESS, SERVER_PORT, DATABASE_NAME);

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        this._conn_ = DriverManager.getConnection(connectionUrl, DB_USERNAME, DB_PASSWORD);

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        throw new RuntimeException("JDBC not loaded");
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }

    // =============== Apache

    String connectionUrl = "jdbc:sqlserver://"+SERVER_ADDRESS+";database="+DATABASE_NAME+";integratedSecurity=false;";
    String jtdsConnectionUrl = "jdbc:jtds:sqlserver://"+SERVER_ADDRESS+":"+SERVER_PORT+"/"+DATABASE_NAME+"";
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(jtdsConnectionUrl, DB_USERNAME, DB_PASSWORD);

    PoolableConnectionFactory poolableConnectionFactory
            = new PoolableConnectionFactory(connectionFactory, null);
    poolableConnectionFactory.setDefaultAutoCommit(true);
    poolableConnectionFactory.setDefaultReadOnly(false);

    GenericObjectPool connectionPool = new GenericObjectPool(poolableConnectionFactory);
    poolableConnectionFactory.setPool(connectionPool);


    this.pooledDataSource = new PoolingDataSource(connectionPool);

我已经坚持了一个星期了,感谢任何形式的帮助。

我不知道这是否有帮助,但据我所知,您指的不是 JTDS 驱动程序,而是 Microsoft JDBC SQL 服务器的驱动程序。尝试更改

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

至:

Class.forName("net.sourceforge.jtds.jdbc.Driver");

好吧,这并不是真正的解决方案,但确实有效。经过数小时的工作并尝试了几乎所有的方法(从编写自定义连接池到使用 Apache DBCP),我开始意识到问题开始存在,在与我的服务器建立 TCP 连接之后。

我开始意识到,如果每次与服务器建立连接都重新连接到 SQL 数据库,极慢的行为只会降级为不那么快,这是一个大约需要 50 毫秒而不是 5 秒的事务差不多就好了。

我仍然不知道为什么会发生这种情况,我的赌注是 Windows 服务器或 VMWare 网络错误,因为这种行为会随着平台的改变而改变。如果其他人遇到同样的问题,我希望这对您有所帮助。