Struts 2 で MyBatis を使用しており、カスタム セッションのセットアップに興味があります。以下で詳しく説明します。
現在、セッションを開き、クエリを実行し、必要に応じてコミットし、接続を閉じる一連の DAO があります。
public String selectUsername(Integer id){
session = getSession(); //opens the session
mapper = session.getMapper(UserMapper.class); //gets the mapper
String name = mapper.selectUsername(id); //executes query
session.close(); //closes session
return name;
}
それぞれが独自の DAO を持つ小さなオブジェクトで構成される大きなオブジェクトを挿入するなど、複雑なことを行う必要がある場合があります。
public boolean insertNewProfile(UserProfile profile)
{
session = getSession();
mapper = session.getMapper(UserMapper.class);
int result = mapper.insertNewProfile(profile);
session.commit();
int id = mapper.selectId(profile.getUserName());
for(UserSkill skill : profile.getSkills())
skill.setUserID(id);
// insert the user's skills in the database
boolean skillResult = skillDAO.insertSkills(profile.getSkills());
session.close();
return (result > 0) && skillResult;
}
上記では、 を挿入するだけでなく、を使用してUserProfile
関連する も挿入していることがわかります。その DAO は、セッションを開き、コミットし、セッションを閉じます。この複合クエリを1 つのセッションでデータベースに作成しようとしています。UserSkill
UserSkillDAO
アクション レベル (Struts 2) でセッションを開き、コミットし、閉じる関数を作成しようとしましたが、それを試みると### Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed. ### The error may exist in . . .
、セッションを閉じる前にセッションが閉じられるというエラー () が発生します。MyBatis トランザクションの使用を検討しましたが、オンラインの例の多くは古いバージョンの iBatis 用であるか、Spring を使用した例です。
アクション レベルでのセッションの開始/終了の例:
public String execute(){
DAOFactory.openSession();
logger.info("Creating ProjectDAO");
projectDAO = DAOFactory.getDao(ProjectDAO.class);
needDAO = DAOFactory.getDao(ProjectNeedDAO.class);
majorDAO = DAOFactory.getDao(ProjectNeedMajorsDAO.class);
skillDAO = DAOFactory.getDao(ProjectNeedSkillDAO.class);
logger.info("Performing selectAllProjects query.");
projects = projectDAO.selectAllProjects();
// loop over the projects and add the project needs
for(int i = 0; i < projects.size(); i++){
// get all of the project needs for a project
projects.get(i).setProjectNeeds((ArrayList<ProjectNeed>)needDAO.selectProjectNeeds(projects.get(i).getProjectID()));
// loop over all of the project needs and add the majors and skills needed
for(int j = 0; j < projects.get(i).getProjectNeeds().size(); j++){
ArrayList<ProjectNeed> needs = projects.get(i).getProjectNeeds();
needs.get(j).setMajors((ArrayList<ProjectNeedMajor>)majorDAO.selectProjectNeedMajors(needs.get(j).getNeedID()));
needs.get(j).setSkills((ArrayList<ProjectNeedSkill>)skillDAO.selectProjectNeedSkills(needs.get(j).getNeedID()));
}
}
DAOFactory.closeSession();
logger.info("Returning success");
return "success";
}
セッションの開閉には多くのオーバーヘッドがかかり、速度が低下していると思われるため、DAO レベルではなくアクション レベルでいつセッションを開閉するかを選択できるように、コードを書き直す簡単な方法はありますか?私のウェブサイトのパフォーマンス?