We read the world wrong and say that it deceives us.

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

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

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

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

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

 

2011 - 05 - 29技术宅男

4条评论
1,011 views

Nginx 平滑升级过程小记

1.前言:

Nginx 的正式版 1.0已经发布有一段时间了,甚至在2011年5月26日Nginx 1.0.3也发布了,看看现在服务器上依然运行着nginx/0.7.67,于是决定尝试下Nginx平滑升级的特性。

2.准备工作

2.1获取上次编译配置

因为Nginx的安装全部为编译安装,想要进行平滑升级,必须获取到Nginx上一次进行编译安装时的编辑参数,在shell下执行:

# /usr/local/nginx/sbin/nginx –V

查看上次编译的参数信息:

nginx version: nginx/0.7.67

built by gcc 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

TLS SNI support enabled

configure arguments: –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_gzip_static_module

2.2 获取Nginx最新版

此外,我们需要下载Nginx 1.0.3的源代码包并解压缩待用,在shell下执行:

#cd /usr/src/

# wget http://nginx.org/download/nginx-1.0.3.tar.gz

# tar  xvzf nginx-1.0.3.tar.gz

2.3备份当前版本的Nginx

俗话说“有备无患”对于这次升级当然也需要备份原来的版本,备份方法很简单,我们只要把旧版的Nginx主程序改下名,这样哪怕升级失败,我们再把原来的文件名改回来就是了。在shell下执行:

#mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

3.开始升级

3.1 编译最新版Nginx

到这里我们就要开始正式的升级过程了,我们首先需要进到放有nginx最新版源代码的目录下,在shell下执行:

#cd  /usr/src/nginx-1.0.3

之后我们进行编译前的配置过程,需要使用的参数来自2.1小节。在shell下执行:

#./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_gzip_static_module

之后我们使用”make”命令进行编译,请注意,make结束后,不要再执行make install ,否则会覆盖掉现在的配置,就称不上平滑升级了。在shell下执行:

#make

静候编译完成,之后我们进到obj文件夹下,编译完成的文件就放在这下面,我们在shell下执行:

#cd obj

#ls –an

观察是否存在nginx文件,如果存在,就说明我们编译成功,可以通过cp命令将刚刚编译完成的nginx文件拷贝到原版本nginx文件处,但是因为我们现在nginx 在执行中,我们必须先杀掉nginx的进程,之后才能完成替换。所以需要在shell下执行:

#kill `cat /usr/local/nginx/logs/nginx.pid`

#cp nginx /usr/local/nginx/sbin/

#/usr/local/nginx/sbin/nginx

如果最后一步能正常启动nginx,则我们平滑升级步骤就完成了。

4.升级后测试

当然,完成了升级还需要做一些测试,可以测试下以前的页面能否打开,你瞧,现在你能看到这篇日志,说明我已经成功完成了Nginx的平滑升级工作 :)

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).”的异常,系统提示出错的行是如下标示“抛出异常”的行。

  1. public List<Book> searchBorrowed(String id) throws Exception {
  2. List<Book> allBooks = new ArrayList<Book>();
  3. PreparedStatement pstmt = null;
  4. ResultSet rs = null;
  5. 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=?";
  6. pstmt = conn.prepareStatement(sql);
  7. pstmt.setString(1, id);//抛出异常!
  8. rs = pstmt.executeQuery();
  9. while (rs.next()) {
  10. Book book = new Book();
  11. book.setName(rs.getString("name"));
  12. book.setAuthor(rs.getString("author"));
  13. book.setCategory(rs.getString("category"));
  14. book.setBtime(Long.getLong(rs.getString("btime")));
  15. book.setRtime(Long.getLong(rs.getString("rtime")));
  16. allBooks.add(book);
  17. }
  18. return allBooks;
  19. }

 

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

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.

 

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

一口“盐汽水”喷死你!

我想看过《爱情公寓》的人对标题中的这句话一定不会陌生,而今天我竟然在学校的超市内看到了“盐汽水”哈哈……不过话说回来,这个柠檬味的盐汽水果然不怎么好喝哎……感觉有一股薄荷的味道……不过,这下,一口盐汽水喷死你终于可以变成现实了……

2011 - 05 - 23分享心得

2条评论
415 views

你会出这样的错误么?

public class Hello{
	public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
		public static void main(String[] args) {
		try{
		Class.forName("DBDRIVER");
	}catch(Exception e){
		e.printStackTrace();}
	}
}

今天为了连接mysql数据库写了这样一段java代码,无奈却总是报错:

F:\Java>java Hello
java.lang.ClassNotFoundException: DBDRIVER
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at Hello.main(Hello.java:5)

大家看了这段异常会不会认为我是配置”classpath”配置错误了,可是,并不是那样的,我确信我的classpath没有配置错误,你知道他为什么会出这样的错误么……

继续阅读 »

2011 - 05 - 21胡思乱想

4条评论
515 views

转载:帅哥与蟑螂的故事

1
小蟑螂趴在碗柜上偷窥。
那个帅哥哼着小曲儿在洗碗,嗯哼嗯哼,哗啦哗啦。
帅哥洗碗都这么好听吗。小蟑螂爱屋及乌了,帅哥干什么都好看。
小蟑螂黑黑的小脸儿红了。
2
小蟑螂今年一岁多,是三个月前搬到这户人家的。
没办法,上一家的药太厉害了,一下子就把妹妹药死了。
小蟑螂好难过,看着妹妹被纸巾包住,丢进垃圾桶。
小蟑螂再也不敢在那家偷吃东西,饿着肚子逃出来,来到帅哥家。
帅哥大大咧咧,懒得买蟑螂药。帅哥妈妈曾经来帮忙撒药,却不知道撒的都是过期货。
帅哥根本就不怕蟑螂。小蟑螂就住了下来。
3
小蟑螂溜到水槽下的垃圾桶,偷吃里面过期的面包。
帅哥买的面包是蛋奶味的,小蟑螂很喜欢,甜甜的好好吃。
帅哥家的厨房没有蟑螂药。
小蟑螂觉得好开心。
但是帅哥倒垃圾很勤快,如果不抓紧吃掉的话,食物很快就会不见啦。
帅哥还是挺爱干净的。
小蟑螂难过起来,爱干净的帅哥不会喜欢脏乎乎的小蟑螂。 继续阅读 »

动易SiteFactory前台调用工作量统计

最近有这样一个需求,需要在SiteFactory的前台调用作者的工作量统计,发现系统自身并没有提供这样的一个功能,作为一个Programer,这哪能难得住我,嘿嘿,仔细查询了SiteFactory提供的“数据结构”文档,发现在“PE_CommonModel”表中存放了大家发表的各种类型的内容。我想要实现的是统计当月每个人的发文数量(不含未通过审核的)并且按照发文数量进行排序,这样一分析SQL查询语句就出来了:

SELECT  Editor,count(*) AS Num
	FROM PE_CommonModel
		WHERE ModelID=1
			AND NodeID=10
			AND datepart(mm,UpdateTime)=datepart(mm,getdate())
			AND datepart(yy,UpdateTime)=datepart(yy,getdate())
			AND STATUS=99
		GROUP BY Editor
		ORDER BY num DESC;

简单对上面的SQL做下解释,select后面的Editor这个是要统计“作者”,如果大家需要统计“输入者”,可以将此换为“Inputer”,后面的count(*) as Num 是计算发文数量,并用Num表示,这里用Num表示也是为了后面排序时引用方便。

ModelID这一项表示了文章模型,在我的SiteFactory中,ModelID=1代表是文章模型,而NodeID代表了需要统计的小类名称,如果想要统计全部,可以去掉“and NodeID=10”这一行。后面detepart()函数为SqlServer内置的函数,用以格式化时间类型的字段,通过这两句就将查询的文章时间限定在“当月”,当然,你也可以将这两句合为一句:

AND datepart(yymm,UpdateTime)=datepart(yymm,getdate())

后面的status=99代表了所有审核通过的文章,具体的status代码,请自行查询SiteFactory的相关文档。

最后的Group By以及Order By决定了分组及排序的字段,学过Sql的人一定都能明白,这里就不废话了。最后我将我的这个标签导出了,供大家导入测试。当然,如果你有心的话还可以将我所说的那些内容都替换成变量,然后调用标签的时候就能以参数的形式传递进去了,我嘛比较懒,嘿嘿,就不搞啦~~

当月工作量统计标签,单击下载。

联通WLAN使用VPN就掉线的解决方案

联通的WLAN活动对于后付费用户还在依然免费中,这确实让我觉得很爽,不过因为种种原因,经常需要使用VPN,而联通的WLAN使用VPN的时候大约1分钟左右就会掉线,小小研究了下下,发现原来基于Web验证的这个页面每隔一分钟左右就会跟服务器联系一次(心跳),如果联系不到或者超时,就会强迫用户下线~~

既然知道了原理,想要解决也变得相当容易,首先需要收集最近的路由表,我们手动把这些路由写入到本机路由,通过命令:

route add IP地址 mask 子网掩码 网关 metric 优先级

这样的顺序即可。

附件为自动识别网关,并作为当前默认网关的批处理,大家可以再增加任意多条route命令来调整本地路由 :)

当然,这样的好处还有一个:可以让VPN流量走VPN网关,而其他的流量还是走自己的网关,降低VPN的负载,增加安全性与本地网站的访问速度。

附件:Route-Test

返回顶部