首页 > 代码库 > 使用单态(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)模式获取数据库操作对象
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。