Попробуйте вывести на экран около 100 объектов из базы данных - PullRequest
0 голосов
/ 21 марта 2012

Веб-приложение использует один объектный компонент (ejb 2.0) и имеет одну страницу для вывода объектов из базы данных. Я реализую все методы в сущности и проверил все ошибки. У меня есть таблица в базе данных, и я пытаюсь вывести первые 100 объектов (идентификаторы и их имена). Но это занимает 20 секунд для сотен объектов, это нереально медленно :( Перепробовал несколько реализаций Entity Bean, результаты совпадают.

private void loadRow () генерирует SQLException, NamingException, Exception {

    try {
    String selectStatement =
            "select parent_id, object_type_id, object_class_id, project_id, picture_id, name, description, attr_schema_id, order_number, source_object_id, version\n"+
            "from nc_objects where object_id = ?";

    Map results = (Map) JDBCExecutor.execute(selectStatement, Arrays.asList(new Object[]{new BigDecimal(objectId)}), new ResultSetHandler() {

        public Object onResultSet(ResultSet rs) throws Exception {

            Map results = new HashMap();
            if (rs.next()) {
                results.put("parent_id", checkedValue(rs, 1));
                results.put("object_type_id", checkedValue(rs, 2));
                results.put("object_class_id", checkedValue(rs, 3));
                results.put("project_id", checkedValue(rs, 4));
                results.put("picture_id", checkedValue(rs, 5));
                results.put("name", rs.getString(6));
                results.put("description", rs.getString(7));
                results.put("attr_schema_id", checkedValue(rs, 8));
                results.put("order_number", checkedValue(rs, 9));
                results.put("source_object_id", checkedValue(rs, 10));
                results.put("version", checkedValue(rs, 11));

            }

            return results;

        }
    });
    this.parentId = (BigInteger) results.get("parent_id");
    this.objectTypeId = (BigInteger) results.get("object_type_id");
    this.objectClassId = (BigInteger) results.get("object_class_id");
    this.projectId = (BigInteger) results.get("project_id");
    this.pictureId = (BigInteger) results.get("picture_id");
    this.name = (String) results.get("name");
    this.description = (String) results.get("description");        
    this.attrSchemaId = (BigInteger) results.get("attr_schema_id");
    this.orderNumber = (BigInteger) results.get("order_number");
    this.sourceObjectId = (BigInteger) results.get("source_object_id");
    this.version = (BigInteger) results.get("version");
    }
    catch(Exception ex){
        throw new Exception("My EXCEPTION; cannot load object_id = " + objectId, ex);
    }
    String selectStatement = "select object_id, attr_id, value, date_value, list_value_id, data "
            + " from nc_params\n"
            + "where object_id = ?";
    params = (Map) JDBCExecutor.execute(selectStatement, Arrays.asList(new Object[]{new BigDecimal(objectId)}), new ResultSetHandler() {

        public Object onResultSet(ResultSet rs) throws Exception {
            Map results = new HashMap();
            while(rs.next()){
                if(rs.getString(3) != null)
                    results.put(checkedValue(rs, "attr_id"), rs.getString(3));
            }
            return results;
        }
    });
}

Это мой метод loadRow, который вызывается из ejbLoad. Я не уверен, но может быть проблема в этом?

1 Ответ

0 голосов
/ 07 сентября 2012

Ваш метод EJB возвращает 100 объектов в виде списка, или вы делаете 100 вызовов, по одному на строку?

Вызовы метода EJB дороги.Попробуйте упаковать как можно больше данных за один прием.

Попробуйте синхронизировать (еще лучше, профилировать) код внутри вызовов EJB.Вы уверены, что вызовы JDBC молниеносны?

(я не спрашиваю, что заставляет вас в 2012 году использовать EJB вместо более разумных и легких архитектур; надеюсь, это просто устаревшая система.)

...