转自: 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;