API调用datastore_v3.Put()的请求太大而没有使用数据存储区

时间:2013-07-23 09:31:40

标签: google-app-engine jsf primefaces google-cloud-sql

com.google.apphosting.api.ApiProxy $ RequestTooLargeException:API调用datastore_v3.Put()的请求太大。

public static List<Area> readAreas(URL url) {
    List<Area> areas = new ArrayList<Area>();
    try {
        BufferedReader br = new BufferedReader(new FileReader(new File(url.toURI())));
        String row;
        while ((row = br.readLine()) != null) {
            if (row.contains(SEARCHED_ROW)) {
                //get the part after "c"
                String coord[] = (row.split("c"));
                String startCoordM = ((coord[0].trim()).split(" "))[1];
                String curvesCoord= coord[1];

                Area area = new Area();
                area.mPoint= Point.toStartPoint(Point.readPoints(startCoordM));
                area.curves = Curve.readCurves (curvesCoord);
                areas.add(area);
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return areas;
} 

此方法运行时没有任何错误,但是当我注销并登录到我的Web应用程序的同一页面时,此方法一次又一次地运行而没有问题但是抛出了此异常。我正在使用谷歌应用引擎1.8.1与jsf2和primefaces 3.5。从托管bean调用此方法:

public MapMB () {
    eps = EPDAO.getEPList();
    populateAdvancedModel(eps);
    drawPolilines();
}

void drawPolilines() {
    List<Area> areas = Area.readAreas(getFacesContext().getClass().getResource("/map-inksc.svg") );

    for (Area area : areas) {

        List<Curve> curves = area.getCurves();
        Point endPoint = area.getmPoint();

        Polyline polyline = new Polyline();
        polyline.setStrokeWeight(1);  
        polyline.setStrokeColor("#FF0000");  
        polyline.setStrokeOpacity(1);

        for (Curve curve : curves) {
            polyline.getPaths().add( new LatLng(endPoint.getY(),endPoint.getX()) );
            // curve start point is the end point of previous curve (endPoint.getX(),endPoint.getY() )
            double step = 0.01;
            for (double t=0;t<= 1;t=t+step) {
                double x = getCoordFromCurve(endPoint.getX(), endPoint.getX() + curve.getP1().getX(),endPoint.getX() + curve.getP2().getX(),endPoint.getX() + curve.getP3().getX(), t);
                double y = getCoordFromCurve(endPoint.getY(), endPoint.getY() + curve.getP1().getY(),endPoint.getY() + curve.getP2().getY(),endPoint.getY() + curve.getP3().getY(), t);
                polyline.getPaths().add(  new LatLng(y, x) );
            }
            endPoint = new Point (endPoint.getX() + curve.getP3().getX(), endPoint.getY() + curve.getP3().getY());
        }
        advancedModel.addOverlay(polyline);
        polyline = new Polyline();
    }
}

当我没有读取任何数据时(不要使用上面的readAreas()),一切正常。那么从文件读取如何连接到这个错误?我不明白。

如果有一些我没有放在这里的信息,请说。所有这些方法都运行没有错误,然后抛出此异常

1 个答案:

答案 0 :(得分:1)

参见编辑

确定。所以......不知怎的,问题就解决了。怎么样?我不确定。所以我有:

a.xhtml  < include b.xhtml 
c.xhtml  < include b.xhtml
a.xhtml and c.xhtml had the same method bFilterMethod()

JSF bean: a,b,c全部为ViewScoped b有a和c作为托管属性 a.xhtml和c.xhtml有bFilterMethod(),它从数据库中获取一些()数据并设置aProperty和cProperty(它们是相同的)。我在google app引擎日志中看到,方法getsSome()运行大约20次,就像无限循环一样,抛出异常。

现在所有bean都是请求范围的

a.xhtml has aFilterMethod that getsSome() data
b.xhtml has bFilterMethod that getsSome() data
and a and b has c as Managed Property 

希望这对某人有所帮助,但是我很难过,我不确定究竟是什么错误,但很明显是由于数据库中的请求太大而无论此请求只包含3行(此请求被调用的次数太多)< / p>

修改 经过这么多年,我不小心回到了我的主题。所有这一切的真正原因是GAE将会话保存在数据存储区中,并且jsf ViewScoped bean不会像在普通的Java应用程序服务器中那样从会话中删除。所以解决方案只是不要使用ViewScoped bean