使用单态(Singleton)模式获取数据库操作对象

来源:互联网 发布:dwg转换pdf软件 编辑:程序博客网 时间:2024/06/11 08:46

开始先介绍下单态模式,也就是单例模式,我们主要区别于Spring中的原型模式,单例模式就是保证一个类只存在一个实例,就是只初始化一次,第一次完成初始化以后,重复使用的时候,返回的都是这个实例,而且不是重新去new一个新的,这就在DAO层中比较常见,我们定义一个工厂类(seesionFactory),不用每次都去New个用,好处在于节省了内存和时间,但是如果你对象里面的属性值已经改变的话,就不适合使用单例了,只能重新New个,我们一般的用法Spring的Action层就是使用这个原型,可以创建多次实例。需要说一下,使用单例虽然节省了内存和时间,但是在多线程并发场景中容易出线程安全的问题,有一篇文章可以学习下:http://blog.csdn.net/liushuijinger/article/details/9069801,下面写下常用工厂类获取操作数据库对象实例的单态代码模板:

import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;public final class EMF {private final static EntityManagerFactory emfInstance= Persistence.createEntityManagerFactory("hbase-filesharesys");public static synchronized EntityManagerFactory getInstance() {        return emfInstance;}}

上面模板使用的是JPA,通过Persistence.createEntityManagerFactory("persistence文件位置")来获取数据库操作对象。其实阅读了上面文章,我发现这种方式并不是最安全的,下面在补充下较为完善的单态模式代码:

//内部类实现懒汉式public class Singleton {    private static class SingletonHolder{        //单例变量          private static Singleton instance = new Singleton();    }        //私有化的构造方法,保证外部的类不能通过构造器来实例化。    private Singleton() {            }        //获取单例对象实例    public static Singleton getInstance() {    System.out.println("我是内部类单例!");        return SingletonHolder.instance;    }}

懒汉式(避免上面的资源浪费)、线程安全、代码简单。因为java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance。


1 0
原创粉丝点击