有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDBC连接在Windows上非常慢,在Linux上很好

使用JDBC连接到WindowsServer2008计算机上的SQLServer,我遇到了一个非常令人困惑的问题

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

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

// =============== 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) 个答案

  1. # 1 楼答案

    我不知道这是否有帮助,但正如我所看到的,您指的不是JTDS驱动程序,而是针对SQL Server的Microsoft JDBC驱动程序。试着改变

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

    致:

    Class.forName("net.sourceforge.jtds.jdbc.Driver");
    
  2. # 2 楼答案

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

    我开始意识到,如果每次连接到服务器时都重新连接到SQL数据库,那么极慢的行为就会退化为不太快的行为,这是一个大约50毫秒的事务,而不是几乎足够好的5秒钟的事务

    我仍然不知道为什么会发生这种情况,我打赌是Windows服务器或VMWare网络错误,因为这种行为会随着平台的改变而改变。我希望这能帮助其他人解决同样的问题