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

时间:2015-03-16 12:24:25

标签: java sql-server linux jdbc jtds

使用JDBC连接到Windows Server 2008计算机上的SQL Server,我遇到了一个非常令人困惑的问题。

虽然在我的Linux笔记本电脑上使用微软的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);

已经有一周我坚持这一点,任何形式的帮助都表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

我开始意识到,如果我通过与服务器的每个连接重新连接到SQL数据库,那么极慢的行为就会降低到不那么快,这是一个约50ms而不是5秒的事务,这几乎已经足够了。 / p>

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

答案 1 :(得分:0)

我不知道这是否会有所帮助,但正如我所看到的,你不是指JTDS驱动程序,而是指SQL Server的Microsoft JDBC Driver。尝试更改

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

为:

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