享元模式(Flyweight)

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。

FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。

看个例子:




  1. public class ConnectionPool {  
  2.       
  3.     private Vector<Connection> pool;  
  4.       
  5.     /*公有属性*/  
  6.     private String url = "jdbc:mysql://localhost:3306/test";  
  7.     private String username = "root";  
  8.     private String password = "root";  
  9.     private String driverClassName = "com.mysql.jdbc.Driver";  
  10.   
  11.     private int poolSize = 100;  
  12.     private static ConnectionPool instance = null;  
  13.     Connection conn = null;  
  14.   
  15.     /*构造方法,做一些初始化工作*/  
  16.     private ConnectionPool() {  
  17.         pool = new Vector<Connection>(poolSize);  
  18.   
  19.         for (int i = 0; i < poolSize; i++) {  
  20.             try {  
  21.                 Class.forName(driverClassName);  
  22.                 conn = DriverManager.getConnection(url, username, password);  
  23.                 pool.add(conn);  
  24.             } catch (ClassNotFoundException e) {  
  25.                 e.printStackTrace();  
  26.             } catch (SQLException e) {  
  27.                 e.printStackTrace();  
  28.             }  
  29.         }  
  30.     }  
  31.   
  32.     /* 返回连接到连接池 */  
  33.     public synchronized void release(Connection conn) {  
  34.         pool.add(conn);  
  35.     }  
  36.   
  37.     /* 返回连接池中的一个数据库连接 */  
  38.     public synchronized Connection getConnection() {  
  39.         if (pool.size() > 0) {  
  40.             Connection conn = pool.get(0);  
  41.             pool.remove(conn);  
  42.             return conn;  
  43.         } else {  
  44.             return null;  
  45.         }  
  46.     }  


通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redo

在innodb存储引擎中&#xff0c;事务日志通过重做(redo)日志文件和InnoDB存储引擎的日志缓冲(InnoDB Log Buffer)来实现。当开始一个事务时&#xff0c;会记录该事务的一个LSN(Log Sequence Number&#xff0c;日志序列号)&#xff1b;当事务执行时&#xff0c;会往InnoDB存储引…

迭代子模式(Iterator)

顾名思义&#xff0c;迭代器模式就是顺序访问聚集中的对象&#xff0c;一般来说&#xff0c;集合中非常常见&#xff0c;如果对集合类比较熟悉的话&#xff0c;理解本模式会十分轻松。这句话包含两层意思&#xff1a;一是需要遍历的对象&#xff0c;即聚集对象&#xff0c;二是…

ES6基础之——对象表达式

这里定义了两个变量&#xff0c;一个是dessert&#xff0c;一个是drink,let dessertcake,drinkorange;一、根据两个变量的值去定义一个对象&#xff0c;这个对象叫food,对象里面属性跟变量的名字是一样的,属性值对应上面的变量let dessertcake,drinkorange; let food{ dessert:…

前台获取元素节点

$("#id").childNodes;//获取id的全部子节点&#xff1b; $("#id").parentNode;//获取id的父节点&#xff1b; $("#id").nextSibling;//获取id的下一个兄弟节点 $("#id").previousSibling;//获取id的上一个兄弟节点 $("#id")…

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的&#xff0c;因此SQL的性能优化非常重要。要分析与优化SQL的性能&#xff0c;一般是通过查看该SQL的执行计划&#xff0c;然后通过执行计划有针对性地对SQL进行相应的优化。 什么是执行计划&#xff08;Ex…

这半年……

有半日也还清闲的时间&#xff0c;一年的一半也快过完了&#xff0c;那就来谈一谈这半年吧&#xff0c;也对下半年提出点期待。 年初&#xff0c;提出了本年度的的关键词&#xff1a;真实、踏实、勤快。 基于这个指导思想&#xff0c;我对自己半年的评价是&#xff1a;做得不错…

部署自己的tomcat,让tomcat和IIS共同享用服务器的80端口

这几天做了一个网站的CMS系统,当然就要用到TOMCAT来对项目进行部署了.但是客户的服务器上已经安转了我们用.NET制作的OA系统&#xff0c;所以在客户的服务器上已经有完整的IIS7服务&#xff0c;而IIS7默认会占用所有的80端口&#xff08;虽然服务器有两个IP&#xff0c;而它只用…

ueditor1.4.3配置过程(包含单独上传文件以及图片的使用)

这里使用的是ueditor1.4.3的jsp版本的UTF-8版本. 首先下载相应的ueditor,将ueditor文件夹直接拷贝到项目中,文件结构如下所示: 然后将项目要用的jar包导入到lib目录下,在导入之前要先修改一下ueditor的jar包中的bug,这个可以参考这里点击打开链接 接着就是配置jsp目录下的con…

layui如何隐藏弹出层关闭的按钮

layui默认弹出层是带有关闭按钮的&#xff0c;但是在某些场景我们不需要layui的关闭按钮&#xff0c;这时只需添加closeBtn :0即可效果图如下: 示例代码如下: layui.use(layer, function () {var layer layui.layer;layer.open({skin: demo-class,type: 1,title: 登录,area: […

使用httpclient4.3.2来实现微信临时素材的上传

一直在用java来做微信的二次开发&#xff0c;经过一段时间的沉淀总算有了一点门路。其实用java这种强大的语言来做微信的二次开发是很简单的事情。只要解决了加密、https请求的发送、xml的解析这些基本的操作后&#xff0c;用java来进行微信二次开发就变的容易了很多。这里我主…

charles请求入参中有乱码

工作中&#xff0c;需要入参&#xff0c;但是发现入参中&#xff0c;有中文的都是乱码&#xff0c;仔细查阅headers&#xff0c;发现Content-Type是application/x-www-form-urlencoded类型&#xff0c;而实际上&#xff0c;入参是json类型&#xff0c;因此需要强制修改请求头为…

xstream,节点属性起别名时这样的问题你遇到过吗

首先这是我自己定义的一个xstream&#xff0c;这个xstream是为了在处理xml时能够加上<![CDATA[------]]>而特别重写的。这个xstream是没有任何问题的。 private static XStream xstream new XStream(new XppDriver() {public HierarchicalStreamWriter createWriter(Wri…

20190624 Oracle 表分析

dbms_stats.gather_table_stats&#xff08;。。。&#xff09; 参数要注意 正常情况只是为了分析表&#xff0c;也可以通过方法创建记录表 分析的结果会记录的记录表中&#xff0c;当然每次运行会有覆盖&#xff0c;主要分析后的结果。 分析表&#xff0c;记录了目前此表的情况…

用spring搭建微信公众号开发者模式下服务器处理用户消息的加密传输构架(java)

要搭建加密传输的微信公众号消息传输&#xff0c;首先要在开发这平台下载一下微信加密的相关jar包&#xff0c;并做一些准备。准备的步骤如下&#xff1a; 1.打开开发者文档&#xff0c;找到消息加减密--->接入指引&#xff0c;如下图所示&#xff1a; 2.在页面底部找到实例…

Redis 常用命令

1 运行cmd 到redis安装目录&#xff0c;cmd输入redis-cli.exe -h 127.0.0.1 -p 6379 2 密码登录 auth 输入密码 3 设置和获取 set "hello" get "hello" 4 清空 flushall转载于:https://www.cnblogs.com/hanjun0612/p/11078915.html

Spring中AOP的使用

问题&#xff1a;什么是AOP&#xff1f; 答&#xff1a;AOP基本概念&#xff1a;Aspect-Oriented Programming&#xff0c;面向方面编程的简称&#xff0c;Aspect是一种新的模块化机制&#xff0c;用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)&#xff…

Mybatis generator(复制粘贴完成)

命令行模式 1、java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml 2、Maven plugin(mybatis-generator-maven-plugin) 常用 2.1、mvn mybatis-generator:generate 2.2、${basedir}/src/main/resources/generatorConfig.xml 默认读取这个文件&#x…

mybatis自己学习的一些总结

以前一直在使用spring的JDBCTEMPLATE和hibernate做项目&#xff1b;两个都还不错&#xff0c;spring的jdbctemplate用起来比较麻烦&#xff0c;虽然很简单。而hibernate呢&#xff0c;用起来很好用&#xff0c;很方便&#xff0c;但是很多规矩&#xff0c;规则还有方法到现在都…

利用python模拟菜刀反弹shell绕过限制

有的时候我们在获取到目标电脑时候如果对方电脑又python 编译环境时可以利用python 反弹shell 主要用到python os库和sokect库 这里的服务端在目标机上运行 from socket import * from os import * ssocket(AF_INET,SOCK_STREAM)#IVP4 寻址 tcp协议 s.bind((,6666))#补丁端口 …

SpringBoot配置logback-spring.xml日志

SpringBoot配置logback-spring.xml日志 https://blog.csdn.net/qq_35618489/article/details/87709409 在SpringBoot新建 logback-spring.xml 配置文件&#xff0c;因为SPringBoot官方是推荐这个方式 内容&#xff0c;拷贝复制下来就可以了 <?xml version"1.0" e…