DTD文件简介
DTD:Document Type Definition的简写,是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。
DTD文件的使用
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
内部的 DOCTYPE 声明
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
案例
问题描述
在使用ibatis过程中遇到过这样一个问题,sql文件在运行test case 及测试环境下都没有问题,但是到了线上环境,忽然间sql不能执行了,总是运行很长时间然后报出一个mapper文件的错误。
代码及报错情况见下面:
代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="XXX.MQProviderDao">
<resultMap id="result_map" type="XXX.MQInfoDetail">
<result column="topic_name" property="topicName" jdbcType="VARCHAR"/>
</resultMap>
<sql id="column_list">
topic_name
</sql>
<select id="selectTopic" resultType="java.lang.String">
select DISTINCT topic_name from tb_mq_provider
</select>
</mapper>
报错:
调试步骤:
(1)第一次看到这个问题的时候首先怀疑的是sql写的有问题,于是对这个sql做了各种修改的尝试。-失败
(2)访问了一下这个工程中的其他接口,全部失败
(3)然后开始考虑timeout问题,这个timeout并没有报出是哪里timeout了,因为工程中用的cobar,所以第一个怀疑是连接cobar时候超时了,所以找到DBA要来配置的详细信息做了ping和telnet测试,测试结果都显示是可以正常连接到DB的。
(4)幸好此时老大来帮忙,一下就定位到了dtd文件可能声明的有问题,于是和其他工程对比了一下发现:
我的DTD声明:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
正常访问工程的DTD声明:
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd" >
而mqbatis的那个链接在线上环境是不能访问到的,因为很多服务器是不能访问外网的。