项目维护中的tomcat之死

转自: http://dev.21tx.com/2005/01/20/14261.html

*****生产管理项目(JSP+Javabean)SQLServer2000+Tomcat4.1.*
1、实施中tomcat(4.1.*)总是莫名的当机,寻找原因:查看记录连接池已用连接的log,发现已用连接数稳步上升,直至用完,连接耗尽时间和tomcat死翘翘的时间相近(?没有实际检测,留下祸根),于是大批量修改代码,将可能没将连接释放的疑似代码全部修正(偶的code又好看了一点)。
在“浪费”了大量的人力和精力及时光后,高兴得发布出去(当时感觉有缕阳光照在偶得身上,时间中午12点左右,没有测试,失败)!!!
下午2点以后,反馈信息是每隔10分钟tomcat就要翘一次,:((欲哭无泪)。想起没有测试的疏忽,于是xdm赶紧做了一个简单的压力测试(够傻),发现比客户处还严重!发现两点可疑:tomcat控制台有时会出现输出不及时,结果服务器就不响应客户请求;内存使用量增长异常。
同事提醒是不是我们的日志一直用的是一个文件。取得客户处日志,发现已有188M多,无法浏览,检查代码后发现,对日志的处理是打开文件流后一直不关闭。哎,取消了我们自己的日志程序;由此联想起有人说当异常过多的在控制台显示时也会让tomcat挂了(有这么一说吗?我怎么不知道,不明白:(),于是更改了一下log4j的配置,不让其输出到控制台,修改完毕后测试中感觉稍稍稳定,又发布。
再次受打击,Server仍然会嗝儿屁,又被人投诉页面响应时间太长。没有办法,最后在网上发现很多人都说microsoft的JDBC驱动不好,一直没体会,而我们用的就是它,疾病乱投医吧,先下了一个新版(2.2 2004)的驱动,试一试,速度不但提高了,系统也更稳定,总算看到一线生机,最后say biby to microsoft jdbc driver for sqlserver2000,投向jtds了,现在系统果然稳定不少!
偶算是领教了微软这个jdbcdriver的好了。(可惜的是,原因还是不明白

使用ConnectionFactory 方式,必须关闭连接,并在下一次使用的时候判断是否还存在该连接。

 extends HibernateDaoSupport 
public List findByJDBC(String tableName, String fieldName) throws Exception
	{
		List list = new ArrayList();
		Connection conn = this.getSession().connection();
		if(conn == null){
			 ConnectionFactory cFactory = new ConnectionFactory();
			 conn = cFactory.createConnection(); 
		}
		Statement statement = null;
		String queryStr = "select distinct(" + fieldName + ") FROM "
				+ tableName + " order by " + fieldName + " asc";
		ResultSet rs = null;
		try
		{
			statement = conn.createStatement();
			rs = statement.executeQuery(queryStr);
			while (rs.next())
			{
				String value = rs.getString(fieldName);
				CodeName codeName = new CodeName();
				codeName.setValue(value);
				list.add(codeName);
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			log.error("Exception:" + ex);
			throw ex;
		}
		finally
		{
		if (rs != null)
				rs.close();
		if (statement != null)
			statement.close();
		if(conn!=null){
			conn.close();
		}
		rs =null;
		statement=null;
		conn = null;
		}
		return list;
	}


如果使用JdbcTemplate 就不需要考虑这么多情况,因为它已经都帮我们做了。

             List list = this.jdbcTemplate.queryForList(sql);
		Map map = new HashMap();
		if (list != null && list.size() > 0)
		{
			map = (Map) list.get(0);
			if (map.get("ID") != null)
				return Long.parseLong(map.get("ID").toString());
			if (map.get("id") != null)
				return Long.parseLong(map.get("ID").toString());
		}
		return null;


 

发布了53 篇原创文章 · 获赞 13 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/honghuajun/article/details/8939894
今日推荐