0

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 つのセッションでデータベースに作成しようとしています。UserSkillUserSkillDAO

アクション レベル (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 レベルではなくアクション レベルでいつセッションを開閉するかを選択できるように、コードを書き直す簡単な方法はありますか?私のウェブサイトのパフォーマンス?

4

0 に答える 0