The web application [/xxx] registered the JDBC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver


最近tomcat总是内存泄漏,物理内存明明给的很足,找了很多办法没有解决,最后查看日志发现有严重报错:

The web application [/xxx] registered the JDBC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver

问题已经知道了,接下来解决之:

1、将web-inf下lib中的jstl外部jar包进行替换:JSTL1.2(jstl-1.2.jar)替换JSTL1.1(standard-1.1.jar和jstl-1.1.jar)

2、web.xml必须指定使用servlet 2.5 和JSP2.1的规范:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">

这里注意一下:tomcat版本是可以向下兼容servlet规范和jsp规范的,例如上面的,如果项目中没有用到tomcat6对应的servlet2.5规范和jsp2.1规范,可以还是用servlet2.4和jsp2.0规范(针对xml文件的配置)

 

3、此步的解决方法有多种:

第一:在web.xml文件中添加

<jsp-property-group>
<deferred-syntax-allowed-as-literal>
true
</deferred-syntax-allowed-as-literal>
</jsp-property-group>

第二:在jsp页面中添加<%@ page contentType="text/html; charset=UTF-8" deferredSyntaxAllowedAsLiteral="true"%>

以上两种方式我都试过了,没起作用,

我采用第三种:将#{。。。。}更改为\#{。。。。}

还有第四种方法:将页面中所用使用的#{}表达式换掉,

ps:当你选择tomcat6时还可能遇到一个问题,那就是控制台

严重: The web application [/codeMarket] registered the JBDC driver[.........]   but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

如果你报错了上面的这个严重,那么你的tomcat版本一定是在6.0.25之上的

原因:tomcat 6.025以后在sever.xml中引入了内存泄露侦测,对于垃圾回收不能处理的对像,它就会做日志。

解决办法:

1、tomcat版本换为6.0.25之下的

2、在tomcat的server.xml文件中,把
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>这个监听给关了,对项目有没有影响,如果没有关闭监听前没有报此类异常,则关闭监听没有影响,如果关闭监听前有相关异常抛出,那么影响就相当于没有痛觉的人,生病了也不知道,网上并没有治本的方法,因为治本的方法是把你的内存泄露问题处理好


Whatever is worth doing is worth doing well.