Java堂  


JPA和Hibernate注解的继承问题

归档在: JavaPlateform, Web&Server — Jet @ 3:03 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/06/19/0308269.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

UUID类型的主键字段是长度为32的字符类型,Hibernate中自带自动生成UUID类型的主键,但有的时候需要自定义长32的字符串最为主键值,因此这里就有了一个分类关系:系统自带的UUID和用户自定义的UUID都有一个共性,都是一个长32的字符。我们基于此创建一个继承体系。

  1. // UUIDBase.java
  2. @MappedSuperclass
  3. public abstract class UUIDBase {
  4.  
  5.     protected String id;
  6.  
  7.     @Id
  8.     @Column(nullable=false, updatable=false, length=32)
  9.     public String getId() {
  10.         return id;
  11.     }
  12.  
  13.     public void setId(String id) {
  14.         this.id = id;
  15.     }
  16. }
  1. // UUIDSystem.java
  2. @MappedSuperclass
  3. public abstract class UUIDSystem extends UUIDBase {
  4.     @Override
  5.     @GeneratedValue(generator="system-uuid")
  6.     @GenericGenerator(name="system-uuid", strategy="uuid")
  7.     public String getId() {
  8.         return id;
  9.     }
  10. }
  1. // UUIDCustom.java
  2. @MappedSuperclass
  3. public abstract class UUIDCustom extends UUIDBase {
  4.     @Override
  5.     @GeneratedValue(generator="custom-uuid")
  6.     @GenericGenerator(name="custom-uuid", strategy="package.IDGenerator")
  7.     public String getId() {
  8.         return id;
  9.     }
  10. }
  1. // POJO.java
  2. @Entity
  3. public class POJO extends UUIDCustom {
  4.     //...
  5. }

但是如果这样做的话如果对POJO进行操作的时候,会出现如下的异常:
org.hibernate.MappingException: Repeated column in mapping for entity

如果将UUIDBase修改如下:

  1. // UUIDBase.java
  2. @MappedSuperclass
  3. public abstract class UUIDBase {
  4.  
  5.     protected String id;
  6.  
  7.     @Id
  8.     @Column(nullable=false, updatable=false, length=32)
  9.     @GeneratedValue(generator="system-uuid")
  10.     @GenericGenerator(name="system-uuid", strategy="uuid")
  11.     public String getId() {
  12.         return id;
  13.     }
  14.  
  15.     public void setId(String id) {
  16.         this.id = id;
  17.     }
  18. }

这个时候无论子类中getId()方法使用什么注解都是无效的,最终主键还是按照父类的主键生成器。

为了避免出现这样的错误,建议将主键的注解一步到位,不要使用继承扩展的方式。

让非NT服务程序像NT服务那样自动运行

归档在: Web&Server — Jet @ 7:19 上午
原文出处: http://www.javatang.com/archives/2008/03/21/1944266.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

我们知道在WindowsNT类系统(Windows2000/XP/2003/Vista)下有一种开机不需要登录就自动运行的程序叫做NT服务程序,这样的程序尤其在服务器系统中尤为重要。但是并非所有非常有用的程序都提供NT服务功能的,如何让这些程序像NT服务程序那样自动运行呢?因为即使将这些程序设置为自动运行也仅仅是使用远程账号登录之后才运行,如果注销的话程序也自动关闭了,达不到NT服务程序的效果。

这里采用的方法就是创建一个账号并让该账号自动登录,从而实现自动开机运行非NT服务程序的效果。最近ARP病毒非常猖獗,下面来说明一下怎样让金山ARP防火墙实现NT服务程序运行,其他应用程序可以以此类推。

(1) 在运行里面输入 compmgmt.msc 打开计算机管理控制台,然后在本地用户-用户中右键创建一个名为 arpuser 的用户名并设置一个密码,将下面的“用户下次登录时须更改密码”选项去掉并勾选“用户不能更改密码”和“密码永不过去”。这时候arpuser用户隶属于Users用户组,主要是为了系统安全考虑。

(2) 在运行中输入“rundll32 netplwiz.dll,UsersRunDll”或“control userpasswords2(Win2000中是control userpasswords)”命令打开“用户账号”对话框,在下面的本机用户列表中选中刚才创建的 arpuser 用户然后将上面的“要使用本机,用户必须输入用户名和密码”复选框去掉,点击“应用”按钮之后会出现一个“自动登录”的对话框,将刚才设置的arpuser密码输入其中然后确定即可。

(3) 重新启动计算机,这个时候就会在任务管理器中的用户标签中看到已经自动登录了刚才我们创建的arpuser用户。接下来打开“C:\Documents and Settings\arpuser\「开始」菜单\程序\启动”目录,将金山arp防火墙的快捷方式放入其中,接下来打开金山arp防火墙的安装目录,将该目录的安全属性添加arpuser用户并设置为全部允许。最后再次重启计算机之后,可以通过任务管理器的进程标签中查看金山arp防火墙已经启动了,显示的用户名为arpuser。

最后在说明几点需要注意的地方:

(1) 可以将注册表中HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run中不必要的程序项删除掉,因为这里的运行程序是对于所有登录用户的。
(2) 除了上面介绍的方式之外还可以通过修改注册表的方法实现上面的效果,具体可以参考参考资料中的“WINDOWS NT 自动登陆的实现”文章。

参考资料:
Windows Xp中如何设置自动登录
WINDOWS NT 自动登陆的实现

Apache+Resin泛域名的设置

归档在: Web&Server — Jet @ 3:25 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/03/18/2532264.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Apache中如果设置范域名的话使用 ServerAlias ,比如

  1. <VirtualHost *:80>
  2.   ServerName javatang.com
  3.   ServerAlias *.javatang.com
  4.   ...
  5. </VirtualHost>

如果使用Apache+Resin架构的话,需要在Resin中设置同样的泛域名与Apache进行对应。在Resin中设置泛域名使用 host-alias-regexp 标签,对应于上面Apache在Resin中设置如下:

  1. <host id="javatang.com" root-directory=".">
  2.    <host-alias-regexp>^([^/]*).javatang.com</host-alias-regexp>
  3.    ...
  4. </host>

参考资料:
host-alias-regexp
apache、resin泛域名、多域名设置

Discuz!一次误删会员用户组的恢复

归档在: Web&Server — Jet @ 6:55 上午
Tags:
原文出处: http://www.javatang.com/archives/2008/03/13/5500263.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天上午好友colin电话过来大呼救急,原来他昨天晚上不知为何把Discuz论坛中的会员用户组除了“新手上路”和“注册会员”之外的用户组都删除了,删除之后发现有许多会员出现了异常:有的出现禁言,有的出现未验证等等。

论坛的版本是Discuz 6,首先在后台将论坛暂时关闭,避免因为新的数据而造成更多的冲突。然后使用SQLyog将原来的数据都备份下来,避免操作数据库出现失误之后可以方便恢复数据。上面这两个前期工作非常重要,事实上在后面的一次操作中就将会员数据给破坏掉了,然后使用备份恢复之后又重新进行操作的。

接下来分析Discuz的数据库,首先查找到记录会员用户组的表名为 cdb_usergroups (前缀cdb_为默认的,或许与你的不同),接下来使用一条查询语句检查一下会员中的group属性:

  1. select uid,username,credits,groupid from cdb_members order by groupid desc

结果发现很多会员的groupid还是保留的被删除的会员用户组id,找到了问题的原因之后就好办了。

首先恢复默认的会员用户组的数据,打开Discuz6安装包中的upload/install/discuz.sql文件,找到下面一行

  1. DROP TABLE IF EXISTS cdb_usergroups;

然后将这行连同下面创建表结果及插入默认数据的sql语句复制下来在MySQL中执行,这样就将会员用户组中的数据恢复到了默认状态。

然后就是需要查看会员表(cdb_members)中的groupid是否都存在于会员组中,查看所有的groupid是否都在cdb_usergroups.id的范围之内(1-15):

  1. select uid,username,credits,groupid from cdb_members where groupid>15 order by groupid desc

如果执行之后发现没有数据则表示一切OK了,如果发现有的话则说明肯定添加过新的会员用户组,这个时候需要对会员中的groupid进行整理:

  1. update cdb_members set groupid=10 where (credits>0 and credits<50) and groupid>8;
  2. update cdb_members set groupid=11 where (credits>50 and credits<200) and groupid>8;
  3. update cdb_members set groupid=12 where (credits>200 and credits<500) and groupid>8;
  4. update cdb_members set groupid=13 where (credits>500 and credits<1000) and groupid>8;
  5. update cdb_members set groupid=14 where (credits>1000 and credits<3000) and groupid>8;
  6. update cdb_members set groupid=15 where (credits>3000 and credits<6000) and groupid>8;
  7. update cdb_members set groupid=16 where (credits>6000 and credits<999999) and groupid>8;

因为groupid为8以下的都为系统组,不需要进行整理。这样整理之后一切都OK了,重新打开论坛。~~

Zend Optimizer 出错造成站点无法访问

归档在: Web&Server — Jet @ 3:17 上午
原文出处: http://www.javatang.com/archives/2008/02/28/1713261.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天有朋友的服务器出现站点无法访问的状况,登录进去看到Apache占用了服务器的大部分内存导致服务器剩余内存很少,如果重启Apache的话依然无法释放内存,只有重启服务器之后才正常。

查看“事件查看器”中出现一个Zend Optimizer错误,而且这个错误都是每次启动服务器之后产生的:

事件类型: 错误
事件来源: Zend Optimizer
事件种类: 无
事件 ID: 487
日期: 2008-2-28
事件: 9:22:15
用户: N/A
计算机: XXX
描述:
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: Unable to view file mapping, 试图访问无效的地址。

查阅了一下网上的资料,其实只有一个版本,具体内容可以看下面的参考资料。我这里结合自己的解决方法总结一下:

首先如果你的PHP使用了eAccelerator则将其注释掉就可以了,这是因为Zend Optimizer同eAccelerator相冲突。其实二者都是用于加速PHP程序的,只要使用其中的一个就可以了。

如果你的PHP没有使用eAccelerator的话则大部分是权限的问题了,这种情况在Apache+PHP中很少见,通常都是在IIS+PHP这种搭配中出现的比较多。这个时候只需要修改%SystemRoot%\Temp的权限,设置为EveryOne全部允许;然后如果该目录下没有ZendOptimizer.MemoryBase@SYSTEM文件的话就手动新建一个文本文件然后命名为ZendOptimizer.MemoryBase@SYSTEM即可。

如果还是有问题的话可以查看一下php下的ext目录中是否有php_yaz.dll和php_zip.dll两个文件,有哪一个就在php.ini将 “extension=…”前面的分号去掉。

做完上面的操作之后如果依然出现问题的话请在下面留言或给我mail,可以再继续探讨。

[后续(2008.3.4):]做完上述的操作之后依然出现上面的错误,不过错误出现的次数少了而已,最后不得已将Zend卸载掉了。现在感觉好像应该是Zend Optimizer的一个bug吧。

参考资料:
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。
解决“事件ID(487)的描述(在资源(Zend Optimizer)中)无法找到”问题

Windows NT系统下的Apache性能优化

归档在: Web&Server — Jet @ 3:08 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/02/19/0801260.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

一般来说,WinNT系统下使用IIS,而Apache在Linux下应用的比较多,但是依然有很多人在WinNT系统下使用Apache而非IIS,可能是基于对Windows系统的熟悉吧。今天就来说一下在Windows系统下如果优化Apache的性能。

mpm_winnt.c是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。

mpm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。

ThreadsPerChild
这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。

mpm_winnt上的默认值是64, 最大值是1920. 这里建议设置为100-500之间,服务器性能高的话值大一些,反之值小一些。

MaxRequestsPerChild
该参数表示每个子进程能够处理的最大请求数, 即同时间内子进程数目.设置为零表示不限制, mpm_winnt上的默认值就是0.

官方参考手册中不建议设置为0, 主要基于两点考虑: (1) 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

因此这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要说明的是,如果这个值设置的太小的话会造成Apache频繁重启,在日志文件中会看到如下的文字:

Process exiting because it reached MaxRequestsPerChild. Signaling the parent

这样一来降低了Apache的总体性能。

另外,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开它:

  1. # 首先需要加载mod_status模块
  2. LoadModule status_module modules/mod_status.so
  3.  
  4. # 然后设置访问的地址
  5. <Location /server-status>
  6.     SetHandler server-status
  7.     Order deny,allow
  8.     Deny from all
  9.     # 如果限制某个IP访问则设置为 Allow from 192.168.1.1
  10.     Allow from all
  11. </Location>

综合来说,因为Windows NT下Apache只能启动父子两个进程,因此只能通过增大单个进程的线程数以及单个进程能够处理的最大请求数来进行优化。其他优化的参数同Linux系统下是一样的,大家可以加以参考。下面针对上述两个参数给出一个建议的设置:

  1. <IfModule mpm_winnt.c>
  2.   ThreadsPerChild 250
  3.   MaxRequestsPerChild 5000
  4. </IfModule>

参考资料:
Apache参考手册
Apache模块 mod_status

解决Apache出现的CPU高占用率的问题

归档在: Web&Server — Jet @ 10:06 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/01/22/0615259.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。

下面我们针对几种错误信息进行分析并给出解决的方法:

1. Apache与WinSock v2相冲突
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。

其错误提示如下所示:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

[error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

[warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptEx failed.

[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

可以依次采用下面的方法来解决上面的问题,如果进行了一步还有问题就继续下一步:

1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :

  1. <IfModule mpm_winnt.c>
  2. Win32DisableAcceptEx # 禁止使用AcceptEx()
  3. </IfModule>

2) 使用System Repair Engineer(SREng)查看WinSocket供应者,如果出现非MS的陌生项则将其删除,并使用软件的“重置WinSocket”按钮进行重置。

3) 卸载与Apache相冲突的杀毒软件或防火墙软件。

如果进行上面的三个步骤之后还有问题,那应该看看是不是还有下面的错误。

2. 是否加载了第三方模块(so文件)
Apache2.x要求所有的第三方模块都必须是线程安全的,但有很多第三方的模块可能存在内存泄露,因此时间一长就可以极大的消耗Apache资源。所以可以采用将所有的第三方模块逐个关闭的方法看看运行一段时间之后Apache对资源的占用是否有所改善。

3. “Terminating 1 threads that failed to exit”错误
上面错误中的数字1有可能是其他数字,造成这个错误的原因是Apache在关闭并发线程的时候出现线程溢出,从而造成内存泄露,表现出来的就是Apache所占用的系统资源持续增长。

具体来说,Apache的子进程在结束当前请求之前会首先将所有的并发线程进行关闭,在关闭的时候会等待3分钟,如果3分钟之内没有将所有的线程关闭则会抛出上述的错误提示,然后强制关闭。这样就造成了内存溢出,时间一长会使得Apache所占用资源持续增长直到无法工作。这个时候可以适当将MaxRequestsPerChild的值降低,使得Apache子进程所并发的线程数量减少,从而降低该错误出现的几率。

但是这种方式并不能彻底解决问题,幸好Apache2.0.x的最新版本(2.0.63)解决了之前版本的这个问题,如果3分钟之内有线程没有关闭的话会自动根据时间情况再增加等待结束的时间直到最终将所有的线程结束。日志文件中会出现类似下面的信息:

Child 1952: Waiting 150 more seconds for 2 worker threads to finish.
Child 1952: Waiting 120 more seconds for 1 worker threads to finish.
Child 1952: All worker threads have exited.

4. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 错误

这个错误是Apache的一个bug(#11997),可以通过 Win32DisableAcceptEx 禁止Apache使用WinSocket v2来避免此bug,具体设置见前述。

5. PHP5.2.1以上版本的libmysql.dll与MySQL5不兼容
PHP5.2.1以后的新版本(截止目前最新版本为5.2.5)中用于连接MySQL的libmysql.dll组件与MySQL5不兼容,在Apache中运行PHP的时候会造成Apache产生CPU100%的问题。

解决的方法就是从http://www.php.net/releases/下载5.2.1版本,将压缩包中的libmysql.dll文件覆盖现在的文件,然后重启Apache就可以了。

6. 病毒或木马程序命名为Apache.exe
有的时候病毒或木马程序会将其名称命名为Apache.exe文件达到一种掩饰的目的,这个时候使用第三方进程分析器查看进程的路径然后将其删除或使用杀毒软件清除就可以了。

7. 程序编写不严谨造成死循环等错误
如果上面的问题都不存在Apache依然产生CPU100%的问题的话,通常来说就应该是Web程序自身的问题了,例如死循环等等。这个时候需要在日志中设置HTTP请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。

日志格式设置如下:

LogFormat “%v %h %l %u %t [%Ts] \”%r\” %>s %b” vhost_common #设置程序执行时间

<VirtualHost xxx.xxx.xx.xx:80>
ServerName xxx.xxx.com
DirectoryIndex index.php index.html index.htm
DocumentRoot “xxx”
# cronolog.exe用于将日志文件进行分割的应用程序,可以在 http://cronolog.org/ 下载
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
</VirtualHost>

参考资料:
apache 遇到[error] (OS 10038) 错误
Error in my_thread_global_end(): 1 threads didn’t exit
Apache 2.2.x (ASF) faulting module errors
Need some advice on Apache 2.2.4 PHP 5.2.3 MYSQL 4.0.26
查看Apache并发请求数及其TCP连接状态
Apache Bug 11997
关于apache.exe开机占用cpu100%的终极解决方法
apache cpu占用100%的问题。
空间持续CPU100%时间过长,如何优化程序

让IIS支持中文文件名和目录

归档在: Web&Server — Jet @ 5:16 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/01/07/1628256.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

默认情况下,无论是IIS5还是IIS6对中文路径或文件名支持的不是很好,主要表现为:图片中含有中文路径显示无法找到网页;含有中文的文件直接使用IE下载的时候出现无法找到的错误等等。

其实解决方法很简单,只要修改一下服务器的注册表即可。打开注册表中的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters\,将右侧的FavorDBCS设置为0,然后重启IIS即可。如果服务器上安装了UrlScan的话还需要将AllowHighBitCharacters打开。

参考资料:
IIS5不支持中文目录的解决办法

解决dllhost占用CPU 100%的免费方法

归档在: OS, Web&Server — Jet @ 8:52 上午
原文出处: http://www.javatang.com/archives/2007/11/29/5253234.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

如果在Windows系统中造成CPU100%的话系统会产生延迟,反映到用所访问的站点上面就是等待的时间加长。其实是一个非常复杂的问题,但是如果是因为dllhost占用了CPU100%的话,绝大多数情况下跟IIS有关。产生这种现象的原因主要是:IIS调用ASP组件(即包括自身的也包括第三方的)的时候出现错误,比如IIS无法找到程序中所调用的组件、Access数据库损坏造成ASP操作线程死锁等等;另外一个就是可能中了冲击波病毒,这样只要找一个专杀工具就可以了,本文不在予以描述。

因为所有的IIS组件操作在任务管理器中都是显示的dllhost.exe所占用的状况,如果想查看具体IIS中哪个部分进行操作可以通过“组件服务”来查看。在控制面板中依次打开“管理工具”-“组件服务”,然后依次选择打开“组件服务”-“计算机”-“我的电脑”-“COM+ 应用程序”,然后在上面右键选择菜单中的“查看”-“状态”,这样可以显示正在运行的组件部分。

但是上面的操作只能粗略的查看,很多时候并不能找到出现问题的哪个部分。如果通过百度或者Google搜索的话绝大部分的文章都是提到使用某公司的产品进行监视(明显应该是软文,看来这家公司推广做的不错,呵呵),其实完全没有这个必要,下面同大家分享一下我解决问题的过程。

如果站点中含有Access数据库文件的话首先不管三七二十一先把这些文件用Access压缩修复一下,如果还出现这个问题的话就证明不是Access数据库的问题了。

其实只要能检测IIS执行的时间以及网址(包含参数)并记录下来,然后查看执行时间比较长的链接就是造成CPU100%的罪魁祸首。问题的关键主要是找到出现问题的链接,开始我想自己写一个ISAPI筛选器进行监视,后来无意中发现IIS自带的日志模块本身就有这个功能。右键站点然后选择“属性”打开“网址属性”对话框,在“网站”标签里面最下面选中“启用日志记录”,这里“活动日志格式”一定选择“W3C 扩展日志文件格式”,其他格式没有执行时间选项。这个时候点击右边的“属性”按钮,在“扩展属性”标签“扩展日志记录选项”中选中“URI资源”(执行操作的网址)、“URI查询”、“协议状态”、“所用时间”(后面就基于此选项的内容进行分析)这几个选项。这样记录下来的日志里面就符合我们的要求了,等到发现dellhost又出现CPU100%之后过一段时间(这是因为IIS为了提高操作效率其日志记录中含有一个操作池,只有达到设定的条件之后才会将池中的内容写入到文件中)之后就可以根据执行时间来救出造成dllhost100%的程序文件了。

有的时候系统中不止一个地方出现问题,所以上面的方法可以重复使用。如果这样操作之后还是有问题的话那应该就是IIS自身的问题了,这个时候需要重新安装初始化IIS,具体的方法可以查看火锅城市空间的文章。另外这篇名为《关于站点程序或者ACCESS出错导致DLLHOST.exe占用CPU达100%的监测办法》的文章也值得一读。

参考资料:
dllhost.exe 100% cpu
dllhost.exe CUP使用率100% 解决方法

非常好的服务器备份软件 - Acronis True Image Server

归档在: Tools, Web&Server — Jet @ 4:58 上午
原文出处: http://www.javatang.com/archives/2007/11/16/5809241.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

服务器备份是非常重要的,特别对于应用于商用的数据。当然备份的方式有很多种,但是我觉得最简单而且有效的一种方式就是增加一块新的硬盘最为备份硬盘,然后使用程序将特定的数据根据频率备份到该硬盘上面,这样即使其中有一块硬盘出现问题依然可以保证数据的完整性。

上面的方案中一款优秀的备份软件是非常重要的,Acronis True Image Server是一个非常棒的选择。这款软件不仅仅可以备份某个磁盘分区,而且还可以备份指定的文件或目录,另外最主要的是它还支持备份任务功能,这样可以设定某个频率来备份指定的数据,非常的强大和方便。

acronis_true_image.png

软件的使用也非常简单,全部采用向导式的操作方式。另外软件有Windows和Linux两个版本,可以在http://www.verycd.com/topics/78520/下载。

下一页 »