当前位置: 首页 > 知识库问答 >
问题:

[Microsoft][JDBC的SQLServer 2000驱动程序]登录已超时

戎高爽
2023-03-14

有一个在java 6(1.6.021)上构建和运行的遗留web应用程序,该应用程序部署在CentOS虚拟机上的Apache tomcat 6.0.29上,该虚拟机连接到两个数据库——一个MySQL数据库(本地)和一个SQL Server 2000数据库(远程)。多年来一切都很好,直到有一天,某个登录到SQL Server的用户收到一个登录超时错误。以前,这是间歇性的,因为登录时确实会出现超时,但现在它已成为“永久性的”,在web应用程序和远程数据库服务器上都没有更改。

web应用程序使用以下代码集调用SQL Server上的多个存储过程:

Connection con = null;
PreparedStatement stmt = null;
String query = "exec StoredProcedureGoesHere ?,?";
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
DriverManager.setLoginTimeout(60);

con = DriverManager.getConnection(
          "jdbc:microsoft:sqlserver://host:port;databaseName=myDB;",
          "user", "pass");

if (con != null) {
    stmt = con.prepareStatement(query);
    ...set parameters of stmt
    stmt.close();
    con.close();
}

假设正在调用并成功执行SP1(存储过程1)。然而,对于SP2的连接部分,我得到了一个错误

[Microsoft][用于JDBC的SQLServer 2000驱动程序]登录已超时。

现在,当再次调用SP1时,我不会收到任何错误,但SQL Server中没有任何更改,这是SP1所期望的。我需要重新启动tomcat,以便按预期执行SP1。如果SP2再次运行,我会得到相同的错误,循环会继续,我需要重新启动tomcat。

以下是我迄今为止尝试过的:

>

  • 使用与web应用程序相同的代码创建了一个测试程序。在服务器中复制并运行它,然后SP1和SP2都成功。设置一个循环,使其在没有问题的情况下运行多次。从而确认这不是许可、防火墙或网络问题(尽管如果我错了请纠正我)

    同一个测试程序在我的本地机器上运行,该机器与web应用服务器和SQL server数据库服务器连接到同一个网络。一切正常,所以仍然不是网络或许可问题。

    清除javaws缓存(javaws-uninstall),删除tomcat/work目录的内容,并重新启动服务器。重启服务器时效果相同:第一次运行SP1成功-SP2超时-SP1未发生任何事情。

    未部署-部署应用程序war文件以重新加载所有内容。

    重新启动SQL server的服务器

    将SQL server的登录超时、查询超时和远程登录超时延长到5分钟,即使之前,SP2将在不到10秒内完成。没有效果。

    重新编译SQL Server中的所有存储过程

    删除所有存储过程并重新创建它们

    当然,如果物理网络连接、路由器升级/降级等发生变化,我仍在等待反馈。当问题开始变得“永久”时,如果它有任何影响的话。但就目前而言,我需要您的意见来尝试其他事情。

  • 共有1个答案

    蓬英逸
    2023-03-14

    我已经“修补”了这个问题,并将告诉你发生了什么(以防有同样问题的人遇到这个问题,并因为没有答案而感到沮丧)。我从来没有真正找到问题的根源,尤其是在被问到这个问题时,我正要离开公司。但我所做的是手动更改代码中的连接字符串,以包含查询和登录的延长超时:

    con = DriverManager.getConnection(
          "jdbc:microsoft:sqlserver://host:port;databaseName=myDB;queryTimeout=300;loginTimeout=300",
          "user", "pass");
    

    尽管我确信从那以后一切都没有改变,而且它刚刚开始“永久”超时,但我只是认为这是一个服务器老化问题(如果有这样的问题),而且可能还有很多内存泄漏,因为正如我所提到的,我在一个测试程序上运行了完全相同的代码,但它是成功的。但在延长超时时间后,问题没有再次出现(直到我离开公司)

     类似资料:
    • 我需要将升级到。 Microsoft网站有以下信息: sqljdbc41.jar ;类库提供了对JDBC4.0 API的支持。它包括JDBC4.0驱动程序的所有特性以及JDBC4.0 API方法。不支持JDBC 4.1(将引发异常“SQLFeaturenotSupportedException”)。 因此,已经在java中运行的JDBC API将正常工作。 但是,Microsoft ODBC驱动程

    • 问题内容: 每个驱动程序之间有什么区别?我的意思是,除了其中之一是开源的 每个优点/缺点是什么? 您会推荐哪一个? 这是jTDS对这个问题的个人看法:http ://jtds.sourceforge.net/ 问题答案: 它们是不同的实现。jTDS驱动程序是Type 4,以我的经验,它具有更好的性能。我已经在生产环境中使用jTDS驱动程序5年,没有任何问题。 我建议使用jTDS。

    • 问题内容: 我正在用Java编写数据库验证工具,并具有首选项屏幕,以便用户可以定义其数据库连接。该工具至少应能够应付DB2,Oracle,Postgresql和Mysql。 我真正想要的是能够向用户提供他们已安装的jdbc驱动程序列表,作为此过程的一部分。 任何人都可以提供用于发现已安装的JDBC驱动程序的代码段吗? 问题答案: 到目前为止,您需要扫描整个类路径(和子文件夹)以查找实现类的类。这样

    • 我需要在Java中使用JDBC做一些简单的实验,我认为运行derby数据库应该是实现这一点的简单途径。 我已经安装了derby,并使用“ij”工具创建了一个表并将一些数据放入其中。我也可以用ij读回数据。 然而,当我试图使用实际的Java代码连接到此时,事情变得很糟糕。这是我尝试了几件事情的情况之一,每件事都以不同的方式失败,所以我希望你们都能原谅这有点模糊。但这些是我迄今为止尝试/失败的要点。

    • 问题内容: 有人告诉我,加载JDBC驱动程序的首选方法是: 我知道,这对于从XML配置文件或用户输入中读取多个驱动程序之间的动态决策更好。我很好奇的是,调用此语句如何将指定的驱动程序加载到我们什至没有将生成的“ Class”对象存储在任何地方的环境中。JavaDocs条目说: 返回与具有给定字符串名称的类或接口关联的Class对象 在那种情况下,Java开发人员仅凭此语句如何设法促进驱动程序对象的

    • 主要内容:JDBC驱动程序是什么?,JDBC驱动程序类型,应该使用哪个驱动程序?JDBC驱动程序是什么? JDBC驱动程序在JDBC API中实现定义的接口,用于与数据库服务器进行交互。 例如,使用JDBC驱动程序,可以通过发送SQL或数据库命令,然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK附带的包包含各种类,其类的行为被定义,实现在第三方驱动程序中完成。 第三方供应商在其数据库驱动程序中实现接口。 JDBC驱动程序类型 JDBC驱动程序实现因Java