1

私はマルチスレッドJavaアプリケーションに取り組んでいます。これは、1秒あたり約1000リクエストのRESTサービスを提供するWebサーバーです。私はリレーショナルデータベースを持っており、それにアクセスするためにHibernateを使用しています。データベースには、1秒あたり約300〜400の要求があります。マルチスレッドの観点から、DAOパターンが正しいかどうか疑問に思います。

したがって、次のようなBaseModelクラスが1つあります。

public class BaseModelDAO 
{

    protected Session session;


    protected final void commit() {
        session.getTransaction().commit();
    }


    protected final void openSession() {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
    }

}

次に、データベースのすべてのテーブルにDAOクラスがあります。

public class ClientDAOHibernate extends BaseModelDAO implements ClientDAO 
{

    private Logger log = Logger.getLogger(this.getClass());

    @Override
    public synchronized void addClient(Client client) throws Exception {
        try {
            openSession();
            session.save(client);
            commit();
            log.debug("client successfully added into database");
        } catch (Exception e) {
            log.error("error adding new client into database");
            throw new Exception("couldn't add client into database");
        } finally {
            session.close();
        }
    }

    @Override
    public synchronized Client getClient(String username, String password) throws Exception {
        Client client = null;
        try {
            openSession();
            client = (Client) session.createCriteria(Client.class).createAlias("user", "UserAlias").add(Restrictions.eq("UserAlias.username", username)).add(Restrictions.eq("UserAlias.password", password)).uniqueResult();
            commit();
        } catch (Exception e) {
            log.error("error updating user into database");
            throw new DBUsersGetUserException();
        } finally {
            session.close();
        }
        return client;
    }
}

これが私の質問です:

  1. 同時リクエストの数を考慮して、dbへのアクセスごとにセッションを開いたり閉じたりしても大丈夫ですか?

  2. 現在、DAOクラスは、アプリケーションのビジネスロジックから直接アクセスされます。DAOマネージャーを使用する必要がありますか?はいの場合、それを実装するための優れた設計は何でしょうか?

4

1 に答える 1

10

いいえ、あなたの実装は良いものではありません:

  • トランザクションは、データ アクセス ロジックではなく、ビジネス ロジックに関連する必要があります。あるアカウントから別のアカウントに送金する場合、借方操作用のトランザクションと貸方操作用の別のトランザクションを持つことはできません。トランザクションはユースケース全体をカバーする必要があります。
  • DAO のすべてのメソッドを同期することにより、2 つの要求が同時にクライアントを取得することを禁止します。DAO にセッション フィールドを含めないでください。セッションは、各メソッドのローカル変数にする必要があります。これにより、DAO はステートレスになり、本質的にスレッドセーフになり、同期の必要がなくなります。
  • Michael がコメントで述べているように、プログラムによるトランザクションを使用すると、コードが冗長になり、複雑になり、ビジネス ユースケースに焦点が当てられなくなります。EJB または Spring を使用して、宣言型のトランザクション管理と例外処理を利用します。
于 2012-08-05T18:23:20.640 に答える