weixin_42306359
weixin_42306359
2009-04-16 14:06

Error -26612 HTTP Status-Code=500

已采纳

cliamcase.c(473) Continuing after Error -26612 HTTP Status-Code=500 (Internal Server Error) for "http//192.168.90.250/crm/insure/hscrm/business/icc/claimcase/claimCaseAction.do?act=onQueryClaimCaseList&clientName=&_currentMenuId=12101"

服务器为一个apache + 两个tamcat的形式,LoaderRunner测试时模拟50用户时偶尔包如上错误,后面ur为点击菜单事件,点击菜单后查询列表

不知哪位高手有知道
[b]问题补充:[/b]
[size=large][color=red]确实claimCaseAction.do中报java.sql.SQLException,但是为什么一样的查询为什么测了很多次都正常只是有时候会报错呢[/color][/size]
[b]问题补充:[/b]
[size=large][color=darkblue]看来huangnetian 的回答感觉可能是分页查询的方法写的有问题,查询数据的DAO是集成自CommonDAO.java的,以实现分页功能,附近为CommonDAO.java ,请帮忙看一下 感激不尽[/color][/size]
[b]问题补充:[/b]
[color=red]各位先谢过,以下为异常和CommonDAO.java
java.sql.SQLException
at com.zhangsheng.hscrm.framework.common.base.CommonDAO.queryForPage(CommonDAO.java:109)
[/color]
[code="java"]
package com.zhangsheng.hscrm.framework.common.base;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.hsipcc.system.PageInfo;
import com.ibatis.sqlmap.client.SqlMapClient;

public class CommonDAO {

protected SqlMapClient sqlMapClient = DAOConfig.getSqlMapInstance();

public static String doCount = "yes"; //标识当前操作是否计算记录总数

private static Logger logger = Logger.getLogger(CommonDAO.class);

/**
 * 统计记录条数
 * 
 * @param id               -- SQLId
 * @param parameterObject  --查询参数
 * @return                 --统计结果
 * @throws SQLException
 */
public int count(String id, BaseEntity parameterObject) throws SQLException {
    BaseEntity count = new BaseEntity();
    int countNum;
    try {
        parameterObject.setDoCount(doCount);

        count = (BaseEntity) sqlMapClient.queryForObject(id,
                parameterObject);

        countNum = Integer.parseInt(count.getSqlCountNum());
    } catch (Exception e) {
        e.printStackTrace();
        throw new SQLException();

    }
    return countNum;
}

/**
 * 分页查询
 * 
 * @param id              --  SQLid
 * @param parameterObject -- 条件参数
 * @param pageInfo        -- 分页信息
 * @return                --分页的记录集
 * @throws SQLException
 * 修改历史:
 *   1、修改翻页逻辑 modified by  tangyh  2008-4-10  
 *      
 */
@SuppressWarnings("unchecked")
public List queryForPage(String id, BaseEntity parameterObject,
        PageInfo pageInfo) throws SQLException {
    List pageList;

    if (pageInfo == null) {
        pageInfo = new PageInfo();
    }
    //每页显示的记录数(默认为20条)
    if (pageInfo.getPageLines() == 0) {
        pageInfo.setPageLines(20);
    }
    try {
        //计算总记录数
        int countResult = count(id , parameterObject);
        //计算总页数
        int pages=(countResult + pageInfo.getPageLines() - 1)/ pageInfo.getPageLines();
        //当前页码
        int curPage=pageInfo.getCurrentPage();
        if (curPage < 1) curPage=1;
        if(curPage > pages ) curPage=pages;

        parameterObject.clears();

        //总记录数
        pageInfo.setTotalRows(countResult);
        //总页数
        pageInfo.setTotalPages(pages);
        //当前页码
        pageInfo.setCurrentPage(curPage);
        int beginRows = (pageInfo.getCurrentPage()-1) * pageInfo.getPageLines();

        pageList = sqlMapClient.queryForList(id, parameterObject, beginRows, pageInfo.getPageLines());
    } catch (Exception e) {
        e.printStackTrace();
        throw new SQLException();
    }
    return pageList;
}

/**
 * @param userId
 * @return 根据用户Id返回其上司列表
 * @throws SQLException
 */
public List<String> getUpperUser(String userId) throws SQLException{
    String upper = (String)sqlMapClient.queryForObject("queryUppers",userId);
    if (upper == null){
        upper = "";
    }
    String uppers[] = upper.split(",");
    List<String> retList = new ArrayList<String>();
    if (uppers != null && uppers .length != 0 && !"".equals(uppers[0])){
        for (String s:uppers){
            retList.add(s);
        }
    }
    return retList;
}

/**
 * @param userId
 * @return 根据用户Id返回其Name
 * @throws SQLException
 */
public String getUserName(String userId) throws SQLException{
    Object obj = sqlMapClient.queryForObject("queryUserName",userId);
    String name = "";
    if (obj != null) {
        name = (String) obj;
    }
    return name;
}

/**查询制定序列的序列值:
 * 注意:此方法只用于Oracle
 * @param sequencesName 序列名称
 * @return 序列值
 * @throws SQLException
 * @throws NumberFormatException
 */
public int getSequences(String sequencesName) throws SQLException{
    String retVal = "";
    int ret = 0;
    try {
        retVal = (String)sqlMapClient.queryForObject("getSequences",sequencesName);

        ret = Integer.valueOf(retVal);
    } catch (NumberFormatException e) {
        logger.error("数据转换异常!");
    } catch (SQLException e) {
        logger.error("获取序列值时,数据库异常:请检查序列"+sequencesName+"是否存在。", e);
        throw e;
    }
    return ret;
}

}

[/code]
[b]问题补充:[/b]
[color=darkred][size=x-large]不小心删了几行注释,109行应为[/size][/color]

[code="java"]

pageList = sqlMapClient.queryForList(id, parameterObject, beginRows, pageInfo.getPageLines());
    } catch (Exception e) {
        e.printStackTrace();
        [color=red]throw new SQLException();[/color]
    }

[/code]

中的throw new SQLException();

谢谢
[b]问题补充:[/b]
开发环境下没有保存不好调试啊 :cry:
[b]问题补充:[/b]
[size=large]谢谢lovewhzlq[/size]

[code="java"]
--- The error occurred while applying a result map.

--- Check the queryClaimBillPage-AutoResultMap.

--- The error happened while setting a property on the result object.

--- Cause: java.lang.RuntimeException: Error setting property 'setClaimNotificationNumber' of 'com.hundsun.hscrm.business.icc.claim.claimcase.entity.ClaimNotificationBill@1f71a09'. Cause: java.lang.ArrayIndexOutOfBoundsException: 1

[/code]

继续测试发现好像是由以上这个错误引起的,claimNotificationNumber属性对应数据库中“[color=red]01-47-09-116[/color]”这种类型的数据转换成entity时报错了,总共才3000条数据,为什么有时会报这个错误呢
[b]问题补充:[/b]
:D 没办法,就这点能力 也就搞搞山寨框架
[b]问题补充:[/b]
昨天的问题还没有解决,但是仍然感谢大家的问答。

当并发达到50左右的时候偶尔会报

The error happened while setting a property on the result object.

--- Cause: java.lang.RuntimeException: Error setting property 'setClaimNotificationNumber' of 'com.icc.claim.claimcase.entity.ClaimNotificationBill@1f71a09'. Cause: java.lang.ArrayIndexOutOfBoundsException: 1

开发环境上调试都正常,再三考虑后觉得可能由以下问题引起的:
sql中查询返回使用的是resultClass="ClaimNotificationBill"而非resultMap,造成性能下降,
没有配置记录集合的映射,没有映射,Ibatis就是瞎子。所有东西都用来反射,那么数据库持久层将是一个大的瓶颈,
程序运行到此处resultClass="ClaimNotificationBill",ClaimNotificationBill类有一百多个属性,invok时性能影响较大,所以经常在此处报错,

以上猜想,明天再去测下看看

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

9条回答

  • wanghaolovezlq wanghaolovezlq 12年前

    Status-Code=500,这个错误就是代表是服务端的内部错误,基本是因为代码写得有问题,
    claimCaseAction.do这个action代码写得应该有问题

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    你猜想得差不多,ibatis的性能真是都是靠自己去维护,它自己不太懂优化

    点赞 评论 复制链接分享
  • hantsy hantsy 12年前

    山寨版本框架。。。

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    并发操作时问题本来就会比较多些,不然都单线程那也太没意思了,
    写代码搞web开发的多注意些并发的问题,

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    这样真的就头痛了,
    我觉得更有可能是count(id , parameterObject); 的问题

    //看看这个,这是一个静态变量,所有继承CommonDAO的都共享这一个变量
    //有些dao可能把它设置成别的值,(可能吧),所以导致后面的用户本来应该是要"yes",//但却得到 是前一个用户修改的值,所以抛异常了,你把这个变量搞成成员变量,我感觉//也许可以解决问题
    public static String doCount = "yes"; //标识当前操作是否计算记录总数

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    现在还是不能确定下面哪行代码导致进入

    catch (Exception e) {

    e.printStackTrace();

    throw new SQLException();

    }

    1:int countResult = count(id , parameterObject);

    2:pageList = sqlMapClient.queryForList(id, parameterObject, beginRows, pageInfo.getPageLines());

    这个你得定位到,

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    at com.zhangsheng.hscrm.framework.common.base.CommonDAO.queryForPage(CommonDAO.java:109)
    这个异常是在哪行代码的时候抛出的,
    具体定位下代码行

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 12年前

    LoaderRunner测试时模拟50用户时,这算是性能,压力测试,只能说明你写的那个代码对数据库操作部分不够完善导致出了java.sql.SQLException异常,
    你把异常信息粘出来研究下

    点赞 评论 复制链接分享
  • weixin_42297497 weixin_42297497 12年前

    多线程操作,对于共享内存的读取都有一个锁定跟解锁的过程.详细可以去google搜索一下多线程同步处理机制.

    点赞 评论 复制链接分享

相关推荐