JDBC - Windows 上的连接速度极慢,Linux 上的连接很好
Posted
技术标签:
【中文标题】JDBC - Windows 上的连接速度极慢,Linux 上的连接很好【英文标题】:JDBC - Connection extremely slow on Windows, Fine on Linux 【发布时间】:2015-03-16 12:24:25 【问题描述】:使用 JDBC 连接到 Windows Server 2008 计算机上的 SQL Server,我遇到了一个非常令人困惑的问题。
虽然它在我使用 Microsoft 的 JDBC 驱动程序和 jTDS 的 Linux 笔记本电脑上运行良好,但当我将应用程序移动到运行 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);
我已经坚持了一周,感谢任何形式的帮助。
【问题讨论】:
【参考方案1】:嗯,这并不是真正的解决方案,但确实有效。经过数小时的工作并尝试了几乎所有事情(从编写自定义连接池到使用 Apache DBCP),我开始意识到问题开始存在,在 TCP 连接到我的服务器之后。
我开始意识到,如果我在每次连接到服务器时都重新连接到 SQL 数据库,那么极慢的行为只会降级到不那么快,即一个事务大约需要 50 毫秒而不是 5 秒,这几乎已经足够了。
我仍然不知道为什么会发生这种情况,我的赌注是 Windows Server 或 VMWare 网络错误,因为这种行为会随着平台的变化而改变。如果其他人遇到同样的问题,我希望这会有所帮助。
【讨论】:
【参考方案2】:我不知道这是否会有所帮助,但正如我所见,您指的不是 JTDS 驱动程序,而是 Microsoft JDBC Driver for SQL Server。尝试改变
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
到:
Class.forName("net.sourceforge.jtds.jdbc.Driver");
【讨论】:
感谢您的帮助。我试过了,但没有运气,它在 Linux 上仍然很快,在 Windows 上慢得要命。并且还会在 Windows 中定期断开连接。有任何想法吗?我很沮丧。以上是关于JDBC - Windows 上的连接速度极慢,Linux 上的连接很好的主要内容,如果未能解决你的问题,请参考以下文章