Используя 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);
Это уже неделя, на которую я застрял, всякая помощь приветствуется.
Ну, это не настоящее решение, но работает. После нескольких часов работы над этим и попробовав почти все (от написания настраиваемого пула подключений к использованию Apache DBCP), я понял, что проблема начинает существовать, ПОСЛЕ того, как TCP-соединение выполняется на моем сервере.
Я понял, что если я подключусь к базе данных SQL с каждым подключением к серверу, чрезвычайно медленное поведение просто ухудшится до не столь быстрого, то есть транзакция занимает около 50 мс вместо 5 секунд, что почти достаточно хорошо.
Я до сих пор не знаю, почему это происходит, и моя ставка связана с сетевой ошибкой Windows Server или VMWare, так как это изменение поведения меняется с помощью замены платформ. Надеюсь, это поможет, если у кого-то еще будет такая же проблема.
Я не знаю, поможет ли это, но, как я вижу, вы не имеете в виду драйвер JTDS, а драйвер Microsoft JDBC для SQL Server. Попробуйте изменить
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
чтобы:
Class.forName("net.sourceforge.jtds.jdbc.Driver");