2009-01-08 42 views
0

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

经过几次请求,应用程序服务器就会死亡,而在日志文件中,我们发现与数据库连接失败相关的异常。

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

我们应该考虑使用连接池来消除问题吗?

此外,我们应该改变我们的驱动程序像jTDS?

回答

1

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

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

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

如果您未能做到这一点,那么您对SQL服务器上的潜在巨大且可能非常有限的资源囤积了起来。

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

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

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

许多人编写的JDBC调用期望通过调用close()来释放每件事情,因为这很无聊,应用程序和服务器在离开时不会立即失败。

确实如此,但这些程序员已经编写了他们的程序,用他们的服务器播放“99瓶啤酒在墙上”。

的资源将被耗尽和请求往往会导致一个或多个以下情况发生:连接请求立即失败,SQL语句立即失败或挂起永远存在,直到一些godawful冗长的事务超时定时器超时等

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

解决这些问题的最快方法是拍摄在您的应用程序中使用Nerf dart与您的SQL服务器交谈时编写JDBC调用的人。当他说,“你为...做了什么?!”只要指出这篇文章,并告诉他阅读它。 (切记不要拍摄眼睛,手中的东西,可能是危险/脆弱的东西等)

至于连接池解决你的问题...没有。很抱歉,连接池只是通过向您的应用程序传递一个预先分配的,或许可以循环使用的连接来加快呼叫速度,从而获得连接。

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

1

我一定会试试jTDS。我以前用Tomcat 5.5使用它,没有任何问题。这似乎是一个相对快速,影响较小的变化,可以作为调试步骤。我认为你会发现它更快,更稳定。它也有开源的优势。

从长远来看,我认为你会想要考虑性能方面的连接池。当你这样做时,我建议看看c3p0。我认为它比Tomcat的内置池选择更灵活,我通常更喜欢“超出容器”解决方案,以便在将来更换容器时不那么痛苦。

+0

有没有人给jTDS试一试?我使用sql server 2000 jdbc连接器运行Tomcat 5.5,并遇到处理特殊字符的问题。这是一个非常痛苦的问题。 – phill 2009-05-29 04:12:00

1

这很难说,真的,因为您提供的实际故障信息如此之少:

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

你能告诉我们:

  • 完全错误是什么 你看到
  • 给我们的代码的一小 例如,你 连接和服务的 之一请求
  • 它是否一致 它 失败或者看起来是随机的交易数

我写了很多与数据库相关的java代码(几乎所有的代码都与数据库相关),并使用了MS驱动程序,jdt驱动程序和jnetDirect中的一个。

我确定如果您向我们提供更多详情,我们可以为您提供帮助。