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
}
}
}
}
}