我从事多线程Java应用程序,它是一个提供REST服务的Web服务器,每秒大约1000个请求。我有一个关系数据库,我使用hibernate来访问它。该数据库每秒约有300-400个请求。从多线程的角度来看,我想知道DAO模式是否正确。
因此,有一个BaseModel类看起来像这样:
公共类BaseModelDAO {
protected Session session;
protected final void commit() {
session.getTransaction().commit();
}
protected final void openSession() {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
}
}
然后我为数据库中的每个表都有一个DAO类:
公共类ClientDAOHibernate扩展BaseModelDAO实现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经理上网吗?如果是的话,实施它应该是一个好的设计?
答案 0 :(得分:9)
不,你的实施不是很好: