Hibernate数据库机制测试(一)

来源:互联网 发布:java初级学生管理系统 编辑:程序博客网 时间:2024/05/20 20:22

在最近的一次面试过程中,被人问到Session究竟是如何处理多线程时,整个人就完全思密达了.之前就是把Hibernate当成一个减少SQL节省成本的工具,之前的系统都没有要求高并发处理要求,并没有关注 这一块.

首先,我编写了一段hibernate普通的数据库测试代码,方法见官方文档官方文档.自从hibernate4开始,我们就可以不在数据库中手动建表,而直接将hibernate的映射配置文件完成后由hibernate自行产生建表sql,自动建立所需要的数据库表.

按照官方的文档步骤,非常幸运,无法正常执行,失败了.所报的错误为:  Caused by:org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set.经过多方查找,最终找到解决方法.

将其中建立SessionFactory的代码稍作修改,传人hibernate.cfg.xml的配置信息.即可正常运行.

return cfg.buildSessionFactory(new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build());
运行完成后数据库中情况三张表格建立完成,并且正常插入了数据.

  假设有两个操作op1和op2,这两次操作先后读取同一条数据,然后op1修改了数据并将数据写回数据库,如果op2也修改了数据,并能够写回到数据库,就会发生op2覆盖了op1的更新数据.那么实际上hibernate会不会允许这样发生呢?我们的测试代码如下:

public static void main(String[] args) {    EventManager mgr = new EventManager();    if(args[0].equals("op1")){        mgr.op1();    }else{    mgr.op2();    } HibernateUtil.getSessionFactory().close();}
private void op2() {System.out.println("op2 is running!");SessionFactory sf = HibernateUtil.getSessionFactory();Session session = sf.getCurrentSession();    session.beginTransaction();        Event e = (Event) session.load(Event.class, 1L);System.out.println(e.getTitle());try {Thread.sleep(1000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}e.setTitle("change by op2");    session.getTransaction().commit();}private void op1() {System.out.println("op1 is running!");SessionFactory sf = HibernateUtil.getSessionFactory();Session session = sf.getCurrentSession();    session.beginTransaction();    Event e = (Event) session.load(Event.class, 1L);    System.out.println(e.getTitle());    try {Thread.sleep(10000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}    e.setTitle("change by op1");    session.getTransaction().commit();}
传人不同的运行参数,会启动两个java实例,运行结果是只有先提交的那个事务可以成功,而后提交的事务无法提交到数据库.



0 0
原创粉丝点击