作为一个java开发菜鸟,维护了几个月公司内部项目,项目是通过tomcat6.0t发布的,服务器使用linux操作系统,数据库是oracle10g,框架采用标准的SSH框架,开发使用MyEclipse8.5,过程很纠结,在这里吧这段时间遇到的问题和解决方法分享一下。
1.tomcat内存修改
通过以下现象,可以初步判断JVM内存不足:
程序抛异常,java.lang.OutOfMemoryError: Java heap space。
进入tomcat \manager\status 管理界面 查看JVM标签下的信息,当Free memory 空闲内存接近 0 ,Total menory 全部内存 接近 Max memory最大内存。这是系统反应很慢,
长时间保持在这一个状态可以说明,内存不足,需要调整java程序运行过程中JVM可以调配使用的内存空间的大小(ps:可能有的程序没有释放内存也可能导致之一情况)。
解决办法:
(1)tomcat
如果你用win
/tomcat/bin/catalina.bat 加上下面的命令: set JAVA_OPTS=-Xms32m -Xmx256m
如果你用unix/linux
/tomcat/bin/catalina.sh 加上下面的命令: JAVA_OPTS="-Xms32m -Xmx256m"
添加位置如下图(ps:位置添加到哪里都无所谓,只要起作用就行):
(2)MyEclipse
启动MyEclipse启动Tomcat无视catalina.bat中设置内存大小的问题。
在tomcat的catalina.bat中设置set JAVA_OPTS=-Xms128m-Xmx256m,直接使用startup.bat启动tomcat没有问题。但是在myeclipse中配置tomcat后,通过myeclipse启动就
出现内存溢出,之前在catalina.bat中设置的内存似乎没有作用。
解决方法:窗口->首选项->MyEcliipse->ApplicationServers->Tomcat->Tomcat5.x->JDK->OptionalJava VM arguments中填写一下内容。
-Xms128m -Xmx256m
-Dcom.sun.management.jmxremote=true
内存具体大小视具体情况制定。
2.tomcat线程池连接数修改
通过以下现象,可以初步判断tomcat线程池连接数不足:
Max threads最大线程数,Current thread当前线程线与Current thread busy当前忙碌线程相等。可以初步判断线程池连接数不足。(ps:程序连接不释放可以引起这样问题)
解决办法:
修改tomcat/conf/server.xml,在线程池节点下添加或者修改以下3个属性
maxThreads="600" ///最大线程数 minSpareThreads="100"///初始化时创建的线程数 maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。 ...... /> 3.oracle数据库session数修改 通过以下现象,可以初步判断oracle设置的processes和session数不足: tomcat抛出无法分发客户端连接的异常,oracle进程数不够无法连接上。 解决办法: (1)查看processes和session sql> select count(*) from v$process; sql> select count(*) from v$session; (2)修改processes和session sql> alter system set processes= 300 scope=spfile; sql> alter system set sessions= 555 scope=spfile; (3)oracle的连接数(session)与其参数文件中的进程数(process)有关,它们的关系如下: sessions = (1.1*process+5) ps:这两个参数需要重启数据库服务才能实现修改。 4.程序连接oracle数据库连接不释放 连接不释放的产生原因有很多种,一般都是由于代码编写不规范造成的,这里不再阐述,只列出尝试解决的几种办法。 (1)Spring dataSource数据源配置 Spring 事务配置 修改Spring 配置文件 applicationContext.xml (2)Spring 事务配置 (3)规范daoImpl层代码,仅仅使用Spring提供的3个模板,规范方法名称使其符合特定的事物。 HibernateTemplate模板 JdbcTemplate模板 SimpleJdbcTemplate 如果需要调用存储过程则使用以下方式: Connection conn = SessionFactoryUtils.getDataSource(template.getSessionFactory()).getConnection(); rs.close(); //此处需要手动关闭连接 (4)配置web.xml ,设置session失效时间 5.oracle数据库锁表 有时造成系统无法正常运行的原因可能是,锁表,这里稍微提一下。 select * from v$locked_object;
p:username="username" p:password="username"
p:maxActive="200" p:maxIdle="30" // 最大连接数量200,初始30。
p:removeAbandoned="true" // 如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)。
p:removeAbandonedTimeout="600" // 设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
p:logAbandoned="true" // 输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏。
p:maxWait="10000" />
CallableStatement cs = conn.prepareCall("{call PRO_PRO(?,?,?,?) }");
cs.setString(1, f.getsName());
cs.setString(2, f.getDwName());
cs.setString(3, f.getDateEnd());
cs.registerOutParameter(4,OracleTypes.CURSOR );
cs.execute();
ResultSet rs =(ResultSet) cs.getObject(4);
cs.close();
conn.close();