使用JDBC连接到Windows Server 2008计算机上的SQL Server,我遇到了一个非常令人困惑的问题。
虽然它在我的Linux笔记本电脑上使用微软的JDBC驱动程序和jTDS都很好,但当我将应用程序移动到运行Windows的设备上时,它的工作速度非常慢,一个SQL命令需要4到10秒才能执行!
我已经尝试了以下所有技术来连接到数据库服务器,几乎所有这些技术在Linux上都很快,在Windows上都很慢。使用jTDS数据源,我了解到它在Windows8上运行良好,但当我将代码移动到运行数据库本身的计算机(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);
我已经坚持了一周了,任何形式的帮助都很感激。
这不是一个真正的解决方案,但有效。经过数小时的工作和几乎所有的尝试(从编写自定义连接池到使用ApacheDBCP),我意识到在与服务器建立TCP连接后,问题开始存在。
我逐渐意识到,如果每次连接到服务器时都重新连接到SQL数据库,那么极慢的行为就会退化到不那么快,也就是说,事务大约需要50毫秒,而不是5秒,这几乎足够了。
我仍然不知道为什么会发生这种情况,我的赌注是Windows Server或VMWare网络错误,因为这种行为会随着平台的变化而改变。如果其他人遇到同样的问题,我希望这能有所帮助。
我不知道这是否会有所帮助,但正如我所看到的,您指的不是JTDS驱动程序,而是用于SQL Server的Microsoft JDBC驱动程序。尝试更改
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
至:
Class.forName("net.sourceforge.jtds.jdbc.Driver");