我在一个多线程 Java 应用程序上工作,它是一个提供 REST 服务的 Web 服务器,每秒大约 1000 个请求。我有一个关系数据库,我使用 hibernate 来访问它。该数据库每秒大约有 300-400 个请求。从多线程的角度来看,我想知道 DAO 模式是否正确。
因此,有一个 BaseModel 类看起来像这样:
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;
}
}
以下是我的问题:
考虑到并发请求的数量,可以为每次访问数据库打开和关闭会话吗?
现在可以直接从应用程序业务逻辑访问 DAO 类。应该使用 DAO 管理器安装吗?如果是,什么应该是一个好的设计来实现它?