关于“msxml3.dll (0x800C0005)系统未找到指定的资源”的另一解决方案

今天学院的首页拉取天气预报的地方出现了“msxml3.dll (0x800C0005)系统未找到指定的资源”的错误提示,在自习室就被叫回来紧急处理,在从教学楼往宿舍走的路上用手机Google了下可能的出错原因,大部分都是说msxml3这个组件有问题,但是因为服务器之前运行一直好好的,所以我不认为是这个地方出现错误。

回到宿舍打开电脑通过VPN拨入学院的校园网,远程连入www服务器,上来先把wwwroot(网站的根目录)按照时间进行排序,看看有没有故障前后修改的文件。这样做有多个好处:
1)避免因为其他人的误操作而造成代码上的错误,想想看,把服务器检查个底朝天,最后发现是有人修改页面的时候不小心改错了行代码,我相信你会哭死吧。
2)能迅速的发现网站服务器是否被人插入恶意代码从而造成的页面访问不正常,一般的Hacker都不会注意到挂马之后被挂马文件的时间属性,从这里也能快速定位可能出现的故障原因。

可是检查下来发现上面的都不是出错原因,这时我的职业敏感性让我想到会不会是提供天气信息的那个页面出现了问题,从服务器上访问腾讯天气页面,果然,找不到服务器,在cmd下使用ping命令拼打不开的那个页面,发现根本无法解析地址,果断使用nslookup命令从Google public dns上获取解析地址,之后修改hosts文件,完成本地解析,重新打开网页,故障解决。

总结:
有时候不要被系统给出的提示信息所迷惑,而且搜索引擎提供的别人遇到的解决方案仅仅只能用于参考,切不要在没搞清楚状况之前就贸然下手。最后我要强调,培养职业敏感性很重要,多看多实践多思考,是培养职业敏感性最佳方法。

 

Parameter index out of range (1 > number of parameters, which is 0).

今天调数据库课程设计(Java+MySql)的时候通过Tomcat测试的时候总是抛出“Parameter index out of range (1 > number of parameters, which is 0).”的异常,系统提示出错的行是如下标示“抛出异常”的行。

[codesyntax lang=”java” lines=”normal”]

public List<Book> searchBorrowed(String id) throws Exception {
	List<Book> allBooks = new ArrayList<Book>();
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	String sql = "select b.name as name,b.author as author,b.category as category,borr.btime as btime,borr.rtime as rtime from borrowed borr,books b where borr.bid=b.id and isreturn=0 and pid=?";
	pstmt = conn.prepareStatement(sql);
	pstmt.setString(1, id);//抛出异常!
	rs = pstmt.executeQuery();
	while (rs.next()) {
		Book book = new Book();
		book.setName(rs.getString("name"));
		book.setAuthor(rs.getString("author"));
		book.setCategory(rs.getString("category"));
		book.setBtime(Long.getLong(rs.getString("btime")));
		book.setRtime(Long.getLong(rs.getString("rtime")));
		allBooks.add(book);
	}
	return allBooks;
}

[/codesyntax]

 

经过多次测试,甚至编写了一个测试用的类直接本地运行调用这个函数却没有出错,Google搜索了下,大家出现这个问题大部分都是ParparedStatement的用法有问题或者Sql语句写的有问题,查了很久,也没找到原因,而最后看到 这里 最后一段话,令我恍然大悟:

[codesyntax lang=”text”]

Please forget about it. I found why the error was occurring.
I was actually using one single PreparedStatement for two different
methods (silly me), and when the flow returned from the called method,
it still was the first preparedstatement rather than the new one,
hence it couldn't found the parameter in the proper indexed position.

[/codesyntax]

 

大体意思是说他使用同一个pstmt执行了两条查询以后出现了这个问题,仔细查看源代码,发现我使用了数据库连接之后没有释放,再次调用的时候,系统就没有再实例化新的pstmt而是直接把刚才用过的这个实例返回给我了,而那个测试用的类没有出现这个问题是因为他仅仅执行了一个SQL查询就退出了,不像我实际中使用的前面还执行了一个登录的过程。知道了问题所在解决起来也便简单的多了,使用代理模式重构代码,通过代理来访问这个具体的数据库操作,从代理中来对数据库的连接与关闭进行处理,这样即更好的解耦,又使得我不用去关注数据库的连接与关闭操作,直接交给代理完成就可以了 :)