zoukankan      html  css  js  c++  java
  • 【JAVA笔记——道】Hibernate 线程本地化基础篇

    在进行数据访问的时候每个用户对应一个线程,而用户的各种数据的处理都是通过线程来完成的。


    根据Hibernate的功能分级,在Dao(Data Access Object)数据访问对象进行基本的对象处理

    例如

    public class CustomerDao {

    private HibernateTemplate ht = new HibernateTemplate();
    /**
    * insertCustomer
    */
    public void insertCustomer(final Customer c){
    ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session s) {
    s.save(c);
    return null;
    }
    });
    }

    /**
    * insertCustomer
    */
    public void updateCustomer(final Customer c){
    ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session s) {
    s.update(c);
    return null;
    }
    });
    }

    public Customer getCustomer(final Integer id){
    return (Customer)ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session s) {
    return s.get(Customer.class, id);
    }
    });
    }

    public List<Customer> findAll(){
    return (List<Customer>)ht.execute(new HibernateCallback() {
    public Object doInHibernate(Session s) {
    return s.createQuery("from Customer").list();
    }
    });
    }
    }

    在DAO上边在进行SERVICE级别的处理,一般会涉及到多个DAO之间SESSION传递,为了解决同一个SERVICE上SESSION相互传递的低效率,在此采用ThreadLocal进行线程本地化技术,实现session的高效共享


    实现步骤如下

    1.hibernate.cfg.xml文件进行配置

    <property name="hibernate.current_session_context_class">thread</property>

    使其支持线程本地化技术

    2.ThreadLocal的实现

    private SessionFactory sf;

    public void initSf(){
    sf = new Configuration()
    .configure()
    .buildSessionFactory();
    }

    public void testLocalThread(){
    //获得currentsession,直接开启全局事务
    sf.getCurrentSession().beginTransaction();
    CusomerDao customerDao = new CustomreDao();
    OrderDao orderDao = new OrderDao();
    Customer c =new Customer();
    Order o = new Order();
    o.setPrice(155);
    c.addOrder(o);
    customerDao.insertOne(c);
    orderDao.insertOne(o);

    //获得currentsession,提交全局事务
    sf.getCurrentSession().getTransaction().commit();
    //获得currentsession,关闭会话
    sf.getCurrentSession().close();
    sf.close();
    }

    简单写一下就是这样,大家可以根据自己的项目进行改造,实际中使用中可以再通过模板进行封装。如果大家有什么问题也可以在留言,也可以在知乎上@寸辰

  • 相关阅读:
    centos7上安装JupyterHub
    我的测试第一篇博客
    TCP,SYN,FIN扫描
    nmap使用帮助翻译
    MySQL 常用函数
    MySQL 视图
    MySQL 索引
    JAVA 注解
    JAVA 反射
    spring boot MySQL极简封装
  • 原文地址:https://www.cnblogs.com/cunchen/p/9464246.html
Copyright © 2011-2022 走看看