0

Web アプリケーションは 1 つのエンティティ Bean (ejb 2.0) を使用し、データベースからオブジェクトを出力するための 1 つのページを持ちます。エンティティのすべてのメソッドを実装し、すべてのエラーをチェックしました。データベースにテーブルがあり、最初の 100 個のオブジェクト (ID とその名前) を出力しようとしています。しかし、100 個のオブジェクトに 20 秒かかります。非常に遅いです:( エンティティ 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 から呼び出されます。よくわかりませんが、もしかしたら不具合があるのでしょうか?

4

1 に答える 1

0

EJB メソッドは 100 個のオブジェクトをリストとして返しますか、それとも行ごとに 100 個の呼び出しを行いますか?

EJB メソッドの呼び出しは高価です。1 回の往復でできるだけ多くのデータをパッキングしてみてください。

EJB 呼び出し内のコードのタイミング (できればプロファイリング) を試してください。JDBC 呼び出しが非常に高速であると確信していますか?

(2012年に、より健全で軽量なアーキテクチャの代わりにEJBを使用する理由を尋ねているのではありません。それが単なるレガシーシステムであることを願っています。)

于 2012-09-06T21:56:46.503 に答える