1。JVM虚拟内存紧张的问题
使用java虚拟机的软件一般都会为jvm开辟一定数量的内存。Tomcat猫默认开辟的内存数量为64MB,这对一般的应用应该足够了,但是在实际的应用中,如果用户的请求数量比较大,而且大量的数据保存在内存中,比如用户有请求一个非常大的数据表,内存远远不够用,就会造成客户端请求变慢甚至得不到响应。这时我们需要增大JVM内存,假设服务器的内存配置为2048MB,则在Tomcat的启动批处理命令中添加如下代码:
java -Xms528m -Xmx1024MB
这样在启动Tomcat时会为其开辟582M的内存,当请求超过528MB时,系统会再为它分配内存至1024MB。
2。数据库垃圾连接回收
通常连接数据库代码如下,依次创建连接、声明、记录集:
Connection conn=DriverManager.getConnection(url,username,password);
Statement stm=conn.createStatement();
ResultSet rs=stm.executeQuery(sql);
而关闭的顺序和方式如下:
rs.close();
stm.close();
conn.close();
但是在实际的应用当中,通常出现某一对象未关闭的情况,原因可能是显示的没有关闭,也可能是隐式的没有关闭,如ResultSet对象的反复时候可能会造成隐式的未关闭。这时候可以查看数据库表v$open_cursor,可以看到没有关掉游标的SQL语句操作。由于java类不自动回收数据库连接,所以会造成游标占满,这时就等于数据库死掉了为了防止这种情况,要在finalize函数里添加如下代码以保关闭数据库连接万无一失:
protected void finalize()
{
try{
if(getConn()!=null&&!getConn().isClosed())
{
rs.close();
stm.close();
conn.close();
}
}catch(SQLException e){}
}
3.Tomcate性能调配
对于几千个用户(比如5000用户)的服务站点来说,各自的调配参数需要相互配合,这主要格局连接吃的数量来调配的,当然连接池的数量高也要求你的服务器有足够的性能。
比如,数据库连接池数量为500,则Tomcat配置如下:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8000" minProcessors="5" maxProcessors="1000"
enableLookups="true" redirectPort="8443"
acceptCount="1000" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />
上面所示的配置表示可以同时接受2000个用户的请求,超时为20s。
(摘选自课本)