老方数据库连接池-包装设计模式_不能放弃治疗呀的博客-程序员宅基地

技术标签: 设计模式  

有时候一个对象的方法可能不是我们想要的功能,我们希望能将这个方法覆写。而对于覆写,我们最直白的感觉就是通过子类继承的方式,但是有时候对于使用web开发而言,我们能知道获取对象的实现接口,而真正对象是属于哪个类我们并不知道,例如Connection接口,HttpServletResponse接口这样的,我们并不知道第三方Jar包或者别的框架具体的实现类,那么我们只能通过已知的接口方式来增强或改写某个对象的方法。

通常增强某个对象方法的方式有三种:

⑴ 使用子类继承某个实现类;

⑵ 使用包装设计模式;

⑶ 使用动态代理。

本篇主要讲解包装设计模式,但要知道动态代理是最佳的解决方法。

包装设计模式主要有如下五个步骤:

① 自定义一个类,实现与目标对象(被增强对象)相同的接口。

② 在自定义的类中定义一个成员变量,来记住(指向)目标对象。

③ 定义一个构造函数,用来接收目标对象。

④ 覆盖想增强或改写的方法。

⑤ 对于其他不想增强或改写的方法,使用刚才记住目标对象的成员变量来一一调用目标对象的方法即可。

以数据库连接的Connection接口为例,我们在数据库连接池中给其他方法的Connection对象必须不能是数据库直接提供的Connection对象,因为其close方法会将连接直接销毁,而我们应该返回的是调用close方法能将连接重新放回池子中的Connection对象,所以我们使用一个包装类来封装数据库提供的Connection对象,覆写其close方法,对于其他方法,则直接使用原来的对象去调用,代码如下:

class MyConnection implements Connection{
      //包装设计模式的类
        private Connection conn;
        public MyConnection(Connection conn) {
      //接收目标对象
            this.conn = conn;
        }

        @Override
        public void close() throws SQLException {
    
            connectionList.addFirst(this.conn);  //调用close方法时只是将连接重新返回池中,而不会销毁
    }

@Override
        public Statement createStatement() throws SQLException {
    
            this.conn.createStatement();  //对于不增强的方法则调用目标对象的方法即可,在MyConnection包装类中其他方法都是这样的
            return null;
    }
    。。。  //以下省略Connection接口中覆写的其他方法,对于不想增强的方法都如上(createStatement方法)所示
}    // MyConnection包装类完成

源自老方笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45037981/article/details/108073002

智能推荐

数据库连接池(设计模式)——数据库

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。个人理解:创建数据库连接是一个很耗时的操作,也容易对...

数据库连接池(五)常见问题总结

一、数据库连接超时: 1、报错: Caused by: com.mysql.cj.exceptions.CJCommunicationsException: The last packet successfully received from the server was 599,998 milliseconds ago. The last packet sent...

数据库连接池实现要解决如下问题

连接池中的池对象应该是Connection连接的代理对象,并且屏蔽掉close等方法,这样是避免用户关闭连接从而导致真实数据库链接被关闭。 2. 数据库连接池应该使用close方法来归还链接,而不是额外的方法,这样的做法是...

【线上错误排查】数据库连接池不够用导致的服务集体雪崩

笔者刚参与项目两周左右,因为没有服务器的权限,就向有权限的同事要了一份当时挂掉的日志来查看,发现了80% 左右都是数据库的错误,或者是因为数据库挂掉导致的微服务间调用链失败的错误 其中让笔者发现关键错误的...

数据库连接池获取坏死连接问题

最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql。开发测试没有问题,在运行中每个一段长的空闲时间就出现异常: java 代码 org.hibernate.exception.JDBCConnectionException: could no...

数据库 -- 由数据库连接池引出的三种设计模式

这里首先对数据库连接池的优化进行了说明,同时自己编写了一个数据库连接池,在实际开发中,为了获取标准的数据源,我们需要去实现javax.sal.DataSource接口, 在实现过程中对于链接对象的close方法进行了不同的...

老方数据库连接池-包装设计模式

有时候一个对象的方法可能不是我们想要的功能,我们希望能将这个方法覆写。而对于覆写,我们最直白的感觉就是通过子类继承的方式,但是有时候对于使用web开发而言,我们能知道获取对象...⑵ 使用包装设计模式; ⑶ 使用

数据库连接池的大小你真的设置对了吗

真实环境prod中的系统,我们该如何设置数据库连接池的大小呢? 一些所谓的开发老鸟可能会肯定的告诉你:没关系,尽量设置的大些,比如设置成200,这样数据库性能会高些,吞吐量也会大些! 对于菜鸟的你,也许认为好像...

大人,时代变了,不要再用老一代的数据库连接池啦(HicariCP)

数据库连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的...

数据库连接池,实现及分析

在我们日常对数据库操作时存在一个问题,要为每次数据操作请求建立一个数据库连接。而每次建立连接都需要花费很多开销,如加载驱动类、注册驱动、获取连接,这样如果在短时间内连接多次,就 会耗费多余的时间(加载...

2020修改版设计模式之代理模式(实现自己的数据库连接池)

在动手写自己的数据库连接池的时候我们先来了解什么是数据库连接池: 模拟一个数据库连接池: public class SimpleConnectionPool { private static List listConnection = new ArrayList(); //初始化10个链接对象 ...

常见性能问题:数据库连接池不释放

最近的性能测试中,遇到一个数据库连接池不释放的问题,下面描述下定位到这个问题的流程。 我们用的是dubbo框架 1.首先,压测过程中,请求失败了,所以,赶紧去看provider服务器日志(tail -f -n500 xxx.log),抛...

数据库连接池的问题

基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期,主要使用的技术是CGI﹑ASP﹑PHP等。之后,Su

使用包装设计模式,实现标准连接池

public class MyDataSource implements DataSource{ private LinkedList pool = new LinkedList(); public MyDataSource() { String driverClassName = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql

数据库连接池代理实现(代理设计模式)-续数据库连接池

在代码中调用close时也可以还连接 对close方法进行修改。 动态代理 作用: 1:对某个方法增强。 2:在不污染源类的情况下,修改原类的行为。 代理类,与被代理类,两个不同的实体。 要求: 所有被代理的类,都...

通过一个简单的数据库连接池分析一下“等待超时模式”

场景描述:开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段),如果该方法能够在给定的时间段之内得到结果, 那么将结果立刻返回, 反之,超时返回默认结果。...

数据库连接池的一种实现方案

数据库连接池有多个开源实现,像dbcp、druid等。这里我们再一次造轮子,思路很简单:当有SQL操作(增删查改)到来时,先到池子里看一眼,如果有可用的连接,拿来用,没有就新建一个连接。连接不在新建时入池,而是在被...

简单建立数据库连接池并包装查询代码

ojdbc14.jar:oracle数据库驱动 commons-lang-2.6.jar:工具包 二:日志工具类 1:建立数据库链接配置文件db.properties(保存在src下): [html] view plaincopyprint? jdbc....

数据库连接池配法

org.gjt.mm.mysql.Driver jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK root 8888 ...上面的一段配置,在c3p0和dbcp中,都是必需的,因为hibernate会根据上述的配置来生成...

数据库连接池出现问题

run on server 出现以下报错org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/****(*表示的是多种类型的错误,例如:/lang/Integer,/sql/Connection等等) ...

一场因数据库连接池配置引发的血案

数据库连接池配置引发的危机 车祸现场: xxx系统由于业务需求,所要部署的定时任务变的越来越多,于是决定利用Quartz框架来做一个任务调度管理模块(采用集群模式,并持久化任务调度信息,数据保存于mysql5.6)。 ...

数据库连接池的原理机制

1、基本概念及原理 对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配?释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想...

线上问题分析系列:数据库连接池内存泄漏问题的分析和解决方案

前言本文来自好朋友彪哥整理,实际的生产问题分析,绝对干货~一、问题描述上周五晚上主营出现部分设备掉线,经过查看日志发现是由于缓存系统出现长时间gc导致的。这里的gc日志的特点是:1.gc...

数据库连接池的实现及分析

为了减轻服务器压力 避免每次访问数据库都要建立一个对数据库的连接,因此数据库连接池是最好的一个功能。 数据库连接池编写原理分析。 1.编写连接池需要实现javax.sql.DataSource接口。 DataSource接口中定义 了...

设计模式之代理模式(实现自己的数据库连接池)

设计模式之代理模式(实现自己的数据库连接池)

使用数据库连接池

使用数据库连接池优化数据库响应 1、在工程中增加WebRoot/META-INF/context.xml 文件,文件内容如下:    maxActive="100" maxIdle="30" maxWait="10000"  username="ro

数据库连接池的简单实现

数据库连接池的简单实现

随便推点

推荐文章

热门文章

相关标签