到这里数据库连接池配置基本完成了。但是如果半个小时服务器死掉一次的话,还是不能令人接受的。开始详细检查tomcat的输出文件%Tomcat%/logs/catalina.out,在这个文件中记录的是所有TOMCAT控制台的输出,一般在JAVA中的抱错信息都会在这里打印出来。自己分析后发现每次TOMCAT死掉之前,都是一堆java.net.SocketException: Too many open files这种错误。这个错误肯定不是程序的问题。
可能是因为每有一个TCP的连接到Linux服务器的80端口,都有一次文件的传输过程,Tomcat服务器会打开一个文件(比如图片文件),传送给请求的客户端浏览器,所以如果访问Tomcat的人数过多,会突破linux系统默认的1024个文件上限。
在/root/.bash_profile文件中加入:
ulimit -n 4096
可以在每次系统启动时候自动执行ulimit命令,把最大文件上传个数调整到4096个。注意ulimit这个命令是针对于一个开打的终端的,比如你在一个终端上面运行ulimit,但是影响到的只是你这个终端上运行的命令和程序的打开的文件数,其他的终端如果再打开,效果仍然是没有运行ulimit -n 4096之前的。大家可以实验一下。
这样之后,服务器大概能维持2小时左右的正常运行,使用TOP命令查看Java进程占用的内存后,发觉一个现象,就是内存使用到256M之后,不会往上增长了(服务器有8G的内存)。上网查了以后,知道了Tomcat默认可以使用的是256M的内存。由于在线人数过多,造成Tomcat默认可以使用的256M的内存不够使用,所以修改Tomcat的启动文件catalina.sh,在“echo “Using JAVA_HOME: $JAVA_HOME”” 后加入JAVA_OPTS=’-Xms256m -Xmx1024m’,256m表示初始化的时候给Tomcat初始内存256M,1024m表示Tomcat最大可使用的内存为1024M。
修改了这个之后,服务器比原先稳定了许多了,可是又发现在有的时候,进行用户登录的时候会报莫名其妙的数据库连接错误。终于在有一次使用ORACLE的客户端程序GOLDEN连接Oracle时,出现了ORA-00020:maximum number of process(150) exceeded 这样一个错误。这是由于数据库服务器访问的连接数过多,会出现ORA-00020:maximum number of process(150) exceeded的错误。Oracle 9i中默认的连接数为150,要修改这个配置文件,需要修改SPFILEORCL.ORA文件中的processes的值。(8.1.5中是init.ora文件,在9i中修改init.ora文件是无效的)这个文件由于是一个二进制的文件,不能直接使用notepad此类的编辑器打开,否则会报错误ORA-27101 Shared memory realm does not exist。使用UltraEdit或者EditPlus之类的可以编辑二进制文件的编辑器打开此文件(直接编辑二进制文件),然后在Windows服务中重新启动Oracle服务器即可。
现在的状况非常好,问题正在逐步的好转之中,不过系统的性能还是非常的差,网页的访问速度很糟糕。到安装Oracle的Win2003服务器上检查了一下Oracle服务器,发现硬盘的占用率很高,基本一致是100% 使用的状况。进入Oracle中进行分析,发现有两条SQL语句非常占用系统的资源,是造成瓶颈的两个SQL。
于是对于原先使用trim的SQL进行优化
由于trim命令会造成大量的硬盘读写(使用trim后造成索引无效),所以把所有使用trim命令的语句修改为使用rpad命令。
例如:
select sfzh from qjgkXSK where trim(sfzh)=:1
改为
select sfzh from qjgkXSK where sfzh=:rpad(1)