支持数据库连接的系统设计
Posted
技术标签:
【中文标题】支持数据库连接的系统设计【英文标题】:System design to support database connectivity 【发布时间】:2015-07-02 22:59:58 【问题描述】:我正在尝试开发一个论坛系统作为大学作业的一部分, 其中包含一个数据库连接部分。 我正在用java编写服务器,并决定使用hibernate作为ORM工具来保存和加载数据库。 我的问题不是关于语法,而是关于整个系统的数据库设计。
-
谁应该负责创建会话和提交事务?我应该制作一个接收对象并将其保存到数据库中的单例,并在不同类的每个设置器/构造器中使用这个单例吗?
应该直接提交内存对象中的每个更改,还是应该只提交每几个更改? (如果是这样,最好的方法是什么?)
【问题讨论】:
【参考方案1】:理想情况下,框架应该为您做到这一点。例如,使用 Spring,您可以简单地使用注解将 Spring bean 的方法标记为事务性的,而会话和事务处理将由 Spring 完成:
@Autowired
private SessionFactory sessionFactory;
@Transactional
public void foo()
Session session = sessionFactory.getCurrentSession();
// do some work with the session
而不是
private SessionFactory sessionFactory;
public void foo()
Session sess = sessionFactory.openSession();
Transaction tx = null;
try
tx = sess.beginTransaction();
// do some with the session
tx.commit();
catch (RuntimeException e)
if (tx != null)
tx.rollback();
throw e;
finally
sess.close();
您不应在每次更改后提交,也不应每隔几次更改提交一次。您应该提交原子的、连贯的更改。这就是事务的全部意义:能够从数据库的一个连贯状态转到数据库的另一个连贯状态。
例如,如果将消息发布到主题论坛包含
保持消息实例 增加论坛的 messageCount 字段 为主题海报创建通知那么这三个更改应该在一个事务中进行,以确保您最终不会导致消息被持久化,但 messageCount 不会增加。
【讨论】:
【参考方案2】:我建议您不要在容器中创建和提交事务,除非您确定要自己完成。在这种情况下,您可以使用 JTA,并使用容器管理事务 (CMT)。还要记住避免 entitymanager-per-operation 反模式。要了解更多信息,请阅读Transactions and Concurrency 并自行决定最适合您的方式。
【讨论】:
【参考方案3】:看看 DAO(数据访问对象)模式。它将有助于提供一种模式来帮助您封装数据访问。
http://en.wikipedia.org/wiki/Data_access_object
另外,这个页面做得很好: Data access object (DAO) in Java
至于第二个问题,答案完全取决于您的要求。通常,您希望每次用户交互至少提交一次。这可能是几次内存更改的结果。在每个实体更改后提交肯定更容易。
【讨论】:
以上是关于支持数据库连接的系统设计的主要内容,如果未能解决你的问题,请参考以下文章