每个connection都有关闭public static List querySQL(String sql, int limit, int offset) {// throws Session s = null; List result = null; Transaction t = null; s = HibernateUtil.currentSession(); //log4.info("querySQL:" + sql + ",limit:" + limit + ",offset:" + offset);
try { t = s.beginTransaction(); Query q = s.createQuery(sql); if (limit > 0) q.setMaxResults(limit); if (offset > 0) q.setFirstResult(offset); result = q.list(); t.commit();
第一,使用当前正常的服务器,配置至少比PC高。
第二,如果某个页面或者某个操作占用服务器资源,请将这个操作分开,分成n步,这样每步的资源只有1/n。
第三,如果这个操作不能够分开的话,将此操作定位为消耗资源的操作,然后允许任何一个用户在10秒或者30秒或者一个固定的时间内只允许操作一次。
第四,如果这个操作针对不同的人返回的结果在某个时间段内(比如说10分钟、半天等)是一样的话,请将该好资源的操作的结果缓存。
第五,如果上述方法都没有效果,请采用最后一种方法:重新设计关于该操作的框架,无论从数据库方面实现还是从代码方面实现,唯一的目的是为了达到要求并且降低资源消耗。针对第五条,有很多方法可以实现,比如说如果是数据库操作的话,如果确实需要,可以邀请相应的数据库专家帮你优化你的sql语句,帮你重新设计你的数据库结构等。给你出一个题目,如果你能做出来了,你就能理解了。
某金融行业的计费系统,每秒钟对数据库的插入操作是10k条,查询是20k次,每天增加的数据量大概是10亿条,你可以尝试一下如何设计这样的数据库结构以及系统架构以实现这样的功能。
软件redhat企业版4
数据库Postgres8.0
应用服务器apache+tomcat+hibernate+c3p0(连接池)不单单是逻辑复杂的功能会出现此问题,就连简单的查询也会出现此问题
并且访问量很小我在想是我的框架有问题,还是我的设计思想出问题了
Session s = null;
List result = null;
Transaction t = null;
s = HibernateUtil.currentSession();
//log4.info("querySQL:" + sql + ",limit:" + limit + ",offset:" + offset);
try {
t = s.beginTransaction();
Query q = s.createQuery(sql);
if (limit > 0)
q.setMaxResults(limit);
if (offset > 0)
q.setFirstResult(offset);
result = q.list();
t.commit();
}
catch (HibernateException e) {
if (t != null)
t.rollback();
//e.printStackTrace();
log4.error("querySQL HibernateException:sql="+sql+" limit:"+limit+" offset:"+offset);
String messages = "exceptions:";
for(int i=0; i<e.getMessages().length; i++){
messages = messages+e.getMessages()[i]+"\n";
}
log4.error(messages);
if(messages.indexOf("I/O error")>0){
log4.info("=====reset db connect===========");
HibernateUtil.setSessionFactory(null);
}
} finally {
try{
HibernateUtil.closeSession();
}catch(Exception e){
log4.info(e.getMessage());
}
}
return result;
}
查出一个300条的结果,至少有900条的sql语句,此表用了三个以上的外键
好像每条记录,每个外键都有一个对应的sql
2,数据库连接池设置过大,当时设置的好像是300,我个人认为连接池是并发访问数据库的峰值,后来改为了25;
3,java的垃圾回工具有时候很懒,可以在适当的地方手动做一些资源回收,服务器内存紧张的时候会感觉很有效。我用的服务器1.5G内存,Mssql多数情况下会占去大半,只留100多M给Tomcat
这样无论用户怎么刷新,产生的资源消耗也是很小的。
当时的具体解决办法就是限制了访问频率,因为按照一般的操作习惯而言,连续动作不会超过1秒或者两秒钟一次,我在Filter中限制相同的用户的访问频率不能超过1秒一次,也就是他们两次提交请求的间隔不能超过1秒。
对于一些很占服务器性能的操作,主要是一些大型的报表的话,你可以做线程限制处理,也就是同一个服务器,最多只允许5-10个报表同时运行,当然,这个和你的服务器的cpu个数有关,也和程序有关。
附2万元以上的 IBM服务器,确实不算是好机器,你可能还需要查看一下,就是峰值的时候,是内存耗尽,还是cpu资源耗尽,然后更新一下服务器,这样可能会比较好一些。
个人意见,仅供参考。
我的会话bean直接续承于实体bean,相当于一层封装,进行各字段的处理
每个需要进行提交信息的页面设置一个令牌或者标记,在处理页检测这个标记,如果没有则继续执行,如果有则提示,然后直接结束程序.