Tomcat 6 中的 SQL Server 连接管理

Posted

技术标签:

【中文标题】Tomcat 6 中的 SQL Server 连接管理【英文标题】:SQL Server connection management in Tomcat 6 【发布时间】:2009-01-08 20:38:29 【问题描述】:

在 Tomcat 6 中运行的 Java Web 应用程序使用 JDBC 连接到 SQL Server 数据库时遇到问题。

在几次请求之后,应用服务器挂掉了,在日志文件中我们发现了与数据库连接失败相关的异常。

我们现在没有使用任何连接池,而是使用标准的 JDBC/ODBC/ADO 驱动程序桥连接到 SQL Server。

我们是否应该考虑使用连接池来解决这个问题?

另外,我们是否应该将驱动程序更改为类似 jTDS 的东西?

【问题讨论】:

【参考方案1】:

如果您不关闭 JDBC 连接,这是正确的行为。

当您使用完每个 JDBC 资源以及您使用它获得的其他 JDBC 资源时,您必须调用它的 close() 方法。

这适用于 Connection、Statement/PreparedStatement/CallableStatement、ResultSet 等。

如果您未能做到这一点,首先您将在 SQL 服务器上囤积大量且可能非常有限的资源。

最终,连接将不会被授予,获取查询以执行并返回结果将失败或挂起。

如果您未将 autoCommit 属性设置为 true,则您还可能会注意到您的 INSERT/UPDATE/DELETE 语句在每个事务结束时未能 commit() 或 rollback() 挂起。

我所看到的是,如果您将上面提到的严格应用到您的 JDBC 客户端代码中,那么 JDBC 和您的 SQL 服务器将非常顺利地工作。如果你写废话,那么一切都会像废话一样。

许多人编写 JDBC 调用时期望通过调用 close() 来释放每个东西,因为这很无聊,而且应用程序和服务器不会在他们忽略它时立即失败。

确实如此,但那些程序员编写了他们的程序来与他们的服务器玩“墙上的 99 瓶啤酒”。

资源将耗尽,请求往往会导致以下一种或多种情况发生:连接请求立即失败、SQL 语句立即失败或永远挂起或直到某个令人讨厌的冗长事务超时计时器到期,等等。

因此,解决这些类型的 SQL 问题的最快方法不是责怪 SQL 服务器、应用程序服务器、Web 容器、JDBC 驱动程序或 Java 垃圾收集器中嵌入的令人失望的人工智能。

解决这些问题的最快方法是射杀在您的应用程序中编写 JDBC 调用的人,该调用使用 Nerf dart 与您的 SQL 服务器通信。当他说:“你这样做是为了什么……?!”只需指向这篇文章并告诉他阅读即可。 (切记不要拍他的眼睛、手里的东西、可能危险/脆弱的东西等)

至于连接池解决您的问题...不。抱歉,连接池只是通过为应用程序提供一个预先分配的、可能是回收的连接来加速获取连接的调用。

牙仙子把钱放在你的枕头下,复活节兔子把鸡蛋和糖果放在你的灌木丛下,圣诞老人把礼物放在你的树下。但是,很抱歉打破了您的幻想 - SQL 服务器和 JDBC 驱动程序不会关闭所有内容,因为您“忘记”关闭您自己分配的所有内容。

【讨论】:

【参考方案2】:

我肯定会试试 jTDS。我过去在 Tomcat 5.5 中使用过它,没有任何问题。作为调试步骤,这似乎是一个相对快速、影响较小的更改。我想你会发现它更快更稳定。它还具有开源的优势。

从长远来看,我认为您会出于性能原因考虑使用连接池。当您这样做时,我建议您查看c3p0。我认为它比 Tomcat 的内置池选项更灵活,而且我通常更喜欢“容器外”解决方案,以便将来切换容器时不那么痛苦。

【讨论】:

有人试过jTDS吗?我正在使用 sql server 2000 jdbc 连接器运行 Tomcat 5.5,并且遇到了处理特殊字符的问题。这是一个非常痛苦的问题。【参考方案3】:

真的很难说,因为你提供的关于实际失败的信息太少了:

在几次请求之后,应用程序 服务器死机并且在日志文件中 我们发现与数据库相关的异常 连接失败。

你能告诉我们吗:

究竟是什么错误 你看到了 给我们一个小 您所在的代码示例 连接并服务您的其中一个 请求 是否经过一致 它的交易数量 失败了,还是看似随机的

我写了很多数据库相关的java代码(几乎我所有的代码都是数据库相关的),并且使用了MS驱动,jdt驱动,还有来自jnetDirect的驱动。

如果您向我们提供更多详细信息,我们可以为您提供帮助。

【讨论】:

以上是关于Tomcat 6 中的 SQL Server 连接管理的主要内容,如果未能解决你的问题,请参考以下文章

从 Tomcat 到 SQL Server 2014 的 Java 7 SSL 连接

在 Tomcat 7 上设置 SQL Server JDBC 连接池和资源

如何列出 SQL Server 中的所有连接?

Confluence 6 SQL Server 输入你的数据库细节

Confluence 6 SQL Server 输入你的数据库细节

SQL Server中常用的SQL语句