私はマルチスレッド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;
}
}
これが私の質問です:
同時リクエストの数を考慮して、dbへのアクセスごとにセッションを開いたり閉じたりしても大丈夫ですか?
現在、DAOクラスは、アプリケーションのビジネスロジックから直接アクセスされます。DAOマネージャーを使用する必要がありますか?はいの場合、それを実装するための優れた設計は何でしょうか?