系统设计支持数据库连接

时间:2015-04-24 11:02:37

标签: java database architecture

我正在努力建立一个论坛系统作为大学任务的一部分, 其中包含数据库连接部分。 我在java中编写服务器并决定使用hibernate作为ORM工具来保存和加载数据库。 我的问题不是关于语法,而是关于整个系统关于数据库的设计。

  1. 谁应该负责创建会话和提交事务?我应该创建一个单独的单元来重新接收一个对象并将其保存到数据库中并在不同类的每个setter /构造函数中使用这个singelton吗?
  2. 应该直接提交内存对象中的每个更改,还是应该只提交每一个更改? (如果是这样,最好的方法是什么?)

3 个答案:

答案 0 :(得分:2)

理想情况下,框架应该为您做到这一点。例如,使用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不会增加。

答案 1 :(得分:0)

我建议您将创建和提交事务留给容器,除非您确定要自己执行此操作。在这种情况下,您可以使用JTA,并使用容器管理事务(CMT)。还要记住要避免使用entitymanager-per-operation反模式。要了解更多信息,请阅读Transactions and Concurrency并确定适合自己的最佳方式。

答案 2 :(得分:0)

看一下DAO(数据访问对象)模式。它将有助于提供一种模式,帮助您封装数据访问。

http://en.wikipedia.org/wiki/Data_access_object

此外,这个页面做得很好: Data access object (DAO) in Java

关于第二个问题,答案完全取决于您的要求。通常,您希望每次用户交互至少提交一次。这可能是几次内存中更改的结果。在每个实体更改后,提交肯定更容易。