1

MySQLデータベースからjson文字列で従業員のリストを返す単純なアプリケーションにPlayFramework2.0を使用しています。私のコントローラーは次のとおりです

public class Application extends Controller {

 public static Result getEmployees() {
        Logger.info("enter getting employee information");
        Promise <List<Employee>> employeeList = Akka.future(new     Callable<List<Employee>>(){
            public List<Employee> call() {
                return Employee.getAll();

            }
        });

        return async(
                  employeeList.map(
                  new Function<List<Employee>,Result>() {
                    @Override
                    public Result apply(List<Employee> employeeList)
                             {
                        // TODO Auto-generated method stub
                      try { 
                        if (employeeList!=null) {
                            return ok(Json.toJson(employeeList));
                        } else {
                            return ok("");
                        }
                      } catch (Exception e) {
                          return ok("");
                      }
                    } 
                  }
                )
         );

  }
}

モデルクラスは以下のとおりです。

public class Employee extends Model{


    @Id
    public Long id;

    @Required
    public String name;

    @Required 
    public Float age;



       public static Model.Finder<Long,Employee> find = new Model.Finder<Long, Employee>(Long.class, Employee.class);

        @Transactional(readOnly = true)
    //    @Cached(key = "alllist")
        public static List<Employee> getAll() {


            //return JPA.em("default").find(Employee.class, 1L);

            Logger.info("Enter getAll");
            if (Cache.get("allList")!=null){
                Logger.info("cache is not null");
                return (List<Employee>) Cache.get("allList");
            }
            EntityManager entityManager = JPA.em("default");
            Query query = entityManager.createQuery("select m from Employee m", Employee.class);
            List<Employee> data = query.setFirstResult(0).getResultList();
            Logger.info("setting cache");
            Cache.set("allList", data);
            entityManager.close();

            return data;



    //      if (find!=null)
    //          return find.all();
    //      else 
    //          return null;
        }


    }

私は、最大ヒープサイズが約1500 MBのMacBookでapacheベンチマークを使用して、本番モードでPlayアプリケーションのベンチマーキングを開始します。

私が気付いたいくつかのことは、リクエストの同時実行性を増やすと、平均応答時間が長くなり、同時実行率が高くなることです。

ab -n 100 -c 10 http://localhost:9000/api/employees/

次のエラーが発生します

[error] play - Waiting for a promise, but got an error: null
java.lang.RuntimeException: null

私のAkka固有の構成はです。

play {

    akka {
        event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
        loglevel = WARNING

        actor {

            deployment {

                /actions {
                    router = round-robin
                    nr-of-instances = 100
                }

                /promises {
                    router = round-robin
                    nr-of-instances = 100
                }

            }

            retrieveBodyParserTimeout = 4 second

            actions-dispatcher = {
                fork-join-executor {
                    parallelism-factor = 1
                    parallelism-max = 100
                }
            }

            promises-dispatcher = {
                fork-join-executor {
                    parallelism-factor = 1
                    parallelism-max = 100
                }
            }

            websockets-dispatcher = {
                fork-join-executor {
                    parallelism-factor = 1
                    parallelism-max = 100
                }
            }

            default-dispatcher = {
                fork-join-executor {
                    parallelism-factor = 1
                    parallelism-max = 100
                }
            }

        }

    }

}
4

0 に答える 0