首页 > 代码库 > 使用单态(Singleton)模式获取数据库操作对象

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

开始先介绍下单态模式,也就是单例模式,我们主要区别于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。


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