JDBC - очень медленное соединение в Windows, Fine в Linux

1

Используя JDBC для подключения к SQL Server на компьютере под управлением Windows Server 2008, я столкнулся с чрезвычайно запутанной проблемой.

Хотя он отлично работает на моем Linux-ноутбуке с использованием драйвера JDBC от Microsoft и работает очень медленно, когда я переношу приложение на запущенное устройство 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);

Это уже неделя, на которую я застрял, всякая помощь приветствуется.

Теги:
sql-server
jdbc
jtds

2 ответа

1
Лучший ответ

Ну, это не настоящее решение, но работает. После нескольких часов работы над этим и попробовав почти все (от написания настраиваемого пула подключений к использованию Apache DBCP), я понял, что проблема начинает существовать, ПОСЛЕ того, как TCP-соединение выполняется на моем сервере.

Я понял, что если я подключусь к базе данных SQL с каждым подключением к серверу, чрезвычайно медленное поведение просто ухудшится до не столь быстрого, то есть транзакция занимает около 50 мс вместо 5 секунд, что почти достаточно хорошо.

Я до сих пор не знаю, почему это происходит, и моя ставка связана с сетевой ошибкой Windows Server или VMWare, так как это изменение поведения меняется с помощью замены платформ. Надеюсь, это поможет, если у кого-то еще будет такая же проблема.

0

Я не знаю, поможет ли это, но, как я вижу, вы не имеете в виду драйвер JTDS, а драйвер Microsoft JDBC для SQL Server. Попробуйте изменить

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

чтобы:

Class.forName("net.sourceforge.jtds.jdbc.Driver");
  • 0
    Спасибо за помощь. Я попробовал это, но не повезло, все же это быстро на Linux и медленно на Windows. А также периодически отключается в Windows. есть идеи? Я опустошен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню