在Linux下使用xerces解析器导致tomcatdown机谁遇到过

现象1:
平台是:Linux9.0+jdk1.4.1.05+tomcat4.0.6+mysql3.23.57

在windows下调试好地一个系统,朝上述平台切换,每次访问包含xml配置文件载入功能地页面,tomcat就自动down掉。

使用地xerces是最新版本,版本号忘了,当时从官方站点拉的最新。windows下用了三个月左右了一直没问题。

使用其DOMParser
调试定位是在这句话时导致的tomcat中止运行

parser.getDocument()

parser时一个DOMParse。

这个问题有些莫名奇妙,是否xerces也有linux和windows版本之分?照理其是pure java应该不会。

问题2:

mysql在本地使用其自身的client没有问题,但通过jdbc连接时每次都说3306端口,拒绝连接。

linux安装时配置了防火墙,所以推断是这里的问题。
关掉防火墙,reboot,再访问,还是说拒绝连接,还可能是哪里问题?

随便猜猜:

1、可能是因为Xerces版本的冲突导致,因为Tomcat自身也带有Xerces。

2、很明显是Mysql的用户权限设置的问题。

1,
我推测也是xerces的版本冲突,但使用我的覆盖他的,或者使用他的覆盖我的,都不行。还是一执行tomcat就down掉。在那句话上try/catch也没有抛出异常。

2,
使用mysql的本地的client程序登录是没有问题。应该不是权限的问题吧。在本地使用mysql命令用jdbc中指定的用户名和密码可以登录管理jdbc中指定的数据库。
另外,在网上查了一下,有人也遇到过此中问题。他们的解释和robbin一样说是没授权。
但,使用grant all priveleges 我得数据库.* to 命令给那个用户授过权后,flush privileges,重起mysql,再访问还是拒绝连接。
所以,推测不是权限的问题,才会想到安装是配置的防火墙。
但去掉防火墙也不行。所以,才比较郁闷。

嘿嘿~~ 你发现 Linux 的 Java 没有 Windows 的好用了?
我也有这种感觉~~ Solaris 和 Windows 的表现都不错,但是 Linux 下的就有点怪怪的~~

不过你这个的问题应该还是 Tomcat 与你的解析器有冲突。
你在 Windows 下也是使用这样的版本搭配吗? 如果不是,就将 Linux 下的换成 Windows 下的搭配方案试试。

1、我认为不是JDK的问题,我现在已经不用Linux了,但是以前我用过好几年的Linux,上面跑Java,很坚固。我坚持认为是解析器冲突。如果你用的JDK版本是1.4的话,出现冲突的可能最大。

因为Tomcat自己用的解析器是Xerces,好像你的程序用的解析器也是Xerces,但是JDK带的偏偏是一个最烂的解析器Crimson,如果你不修改JDK的设置的话,不管你怎么设CLASSPATH,一定用的是Crimson,而不是Xerces,这是由JVM的ClassLoader的规则确定下来的。这一点如果你把JVM启动参数加上-verbose:class,仔细观察load class的顺序就可以发现。

解决办法,在 JDK/JRE/lib目录下创建一个名叫:jaxp.properties的文件,文件内容如下:


javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

第2个问题是一个很经典的问题

MySQL默认的权限设置是有一定的问题的,我机器上的MySQL已经删掉了,只能凭记忆随便说说。

你看看mysql表空间里面的user这个表,就是设置用户权限的,有两个空用户是一定要删掉的,否则你再设权限,远程也无法访问。

然后你可以但到默认情况下只允许从localhost访问,就算你用机器名,用IP访问都不行,你不信你可以用客户端试试如下命令:

mysql -u root -pxxx -h ip/机器名

肯定是拒绝访问。

所以要用grant语句赋予用户从机器名访问,或者从任何地址访问的权限,这样就OK了。

1,
我也同意robbin的看法,应该事冲突的问题。

问题在于怎么解决。

程序中可以确认使用的解析器是xercer而不是jdk自带的那个什么东西。
应为只要我删掉xercer类包,立即会包没有org.apche.xerces.…….AbstactDOMParser的错误。

2,
忘了说一点了,我的WEB APP和mysql在一个物理服务器上。jdbc URL连接中使用的//localhost:3306.

应该不是空用户存在造成的问题吧。以前从没删过那两个用户,但不论登录还是从jdbc连接都没有问题。空用户的存在是让为了本机登录mysql的方便。

在linux下使用mysql已经有两年的历史了,这个问题是我第一次遇到,所以觉得比较奇怪。

你的grant不对,
grant .... to user@localhost.
才行,在命令行使用mysql是不通过网络的,
而mysql的jdbc 是通过网络进行通讯的

1、
>> 程序中可以确认使用的解析器是xercer而不是jdk自带的那个什么东西

你连试都不试我告诉你的方法,光在这里置疑有什么用。我不能保证我的办法一定有效,但是这样的问题考验一个人的troubleshooting的能力,自己不试有什么用?

2、
这一点都不奇怪,我觉的奇怪的是你在Linux上用了MySQL两年了,怎么还对这么基础的MySQL数据库权限问题还搞不清楚。关于空用户允许匿名访问的问题,需要花很多篇幅来详细阐述,在机械工业出版社的《MySQL网络数据库指南》第326页上,专门花了两页的篇幅论述这个问题,找本来仔细看看。

关于本机Client可以访问,但是JDBC使用localhost连接不能访问的问题在于你没有搞清楚client连接和JDBC连接之间有什么区别。

本机Client连接当不指定-h参数的时候,是使用Unix 管道文件连接数据库,而不是TCP连接,所以就算3306端口关上,一样可以连接上。在/tmp下可以找到一个Mysql的管道文件,你把它删了,你再看看能不能连接你就知道了。其实mysql命令的man帮助也应该提到了这一点,而JDBC只能使用TCP连接数据库。

在自己的本子上又装了个环境,再试试就知道了.


只是讨论而已,没必要脸红脖子粗.

1中robbin说的办法,可以肯定不是哪个问题.在单步跟踪时,就事进入xerces的解析器.

至于空用户的问题,和讨论的问题没有关系.从来没听说过mysql必须删掉空用户.
从来没删除过空用户,在以前也没有这个问题.

空用户也不是非删不可,但是不删的话很容易造成权限验证失败,因为空用户总是优先被验证,你看看我说的那本书的详细分析你就知道了。你出错的问题的原因在于你把本机Client连接数据库和JDBC连接数据库混为一谈了,你需要的是用grant对用户进行授权。我安装好Mysql数据库之后往往做的第一件事情就是把用户权限重新设置一遍,这也算是MySQL的一项基本功了。

解析器的问题不容易轻易分析出来,Tomcat有自己的办法来保证使用Xerces,但是你的代码如果直接使用JAXP的话,而用的又是JDK1.4,又不修改设置,肯定会使用Crimson,而不是你想用的Xerces。这样的话,JVM里面会有两套解析器存在,当然正常情况下,由于在不同的Class Loader树下,按理来说也不应该有什么冲突。可能有别的地方Tomcat的配置错误吧。

以后这种帖子不回了,本来是想帮助解决问题的,结果就变成了无结果的争论。

说来惭愧,我一直是个"潜水者",在论坛上没有什么贡献.但我一直都关心着这个坛子的人和文章,她让我懂得了更多,在这里尤其要谢谢robbin,你的文章我一直都很支持,绝大部分文章还保存了起来.

我,甚至很多朋友,都会希望你留下,继续帮助我们解决各种问题的.没有你论坛就会少了很多精采的文章.同时,也希望其它高手不要放弃,虽然偶有不快,但所有这些文章对于我们是非常非常有帮助的.请大家一起共勉!

第二个问题已经解决了。
是授权的问题。

第一个问题,
单步调试jsp进入的也是xerces类。

照robbin的方法试了,问题没有解决。

看来,不是xerces和jdk1.4自带解析器的冲突。

tomcat的设置,我使用的默认设置,什么都没调整。

站点程序放在root目录下。

mysql jdbc驱动和xercesImpl.jar放在common/lib下。

我觉得放在common/lib目录下是不对的,在这个目录下的库Tomcat本身也会load到,很容易产生冲突。最起码应该放在shared/lib目录下,这样所有的应用程序都可以load到,但是Tomcat本身不会load到。最好的办法是直接放到WEB-INF/lib目录下,只有本Web应用才能load到。