首页
精选文章Git查看全文代理模式查看全文代理模式(Proxy)是一种常用的设计模式,该模式一般情况下通过组合的方式包装了实际的服务提供方。代理模式中增加了代理的角色,代理类似于中介横在客户端和服务提供方之间,客户端通过代理对象访问目标对象,屏蔽了实际的目标对象。 除了中介功能之外,代理模式通常可以在目标对象实现的基础上会增加扩展的功能,这些功能一般是横向的功能,例如权限,日志等功能。代理模式可以不修改实际的服务提供方而通过代理实现这些通用的功能,符合软件设计中的开闭原则。 代理模式有两种实现,分别是静态代理或者动态代理。 静态代理 静态代理一般和目标服务对象提供类似的接口,但是实际的执行逻辑一般通过组合实际的目标提供方来实现,而代理提供扩展的功能。 动态代理 动态代理不需要手动实现静态代理中的接口逻辑,而可以通过反射或者字节码技术自动生成代理的实现类。 JVM内置了动态代理的方案,一般使用Proxy类的 newProxyInstance 方法:而扩展方法通常使用 InvocationHandler 来实现:但是JVM提供的动态代理方案需要被扩展的服务提供者必须定义有接口,如果希望对没有接口的类进行扩展,可以使用字节码技术,例如AspectJ等。 Spring中AOP的实现就是通过动态代理实现的。MVCC查看全文数据库在多个客户端并发更新的时候,数据会产生多个版本。数据库查询或者操作时使用哪个版本是数据库的隔离级别关注的问题域,MVCC是该领域的解决方案之一。MVCC,是多版本控制协议的缩写,MVCC技术的主要目的是通过数据的多版本快照读取逻辑实现数据库特定的隔离级别。数据库的隔离级别一般分为读未提交,读已提交,可重复读,串形化等。MVCC只在读已提交(Read Committed)和可重复读(Repeatable Read)两个隔离级别下工作。读未提交以及串行化两个隔离级别和MVCC是不兼容的 未提交读,总数读取最新的数据行,而不是读取符合当前事务版本的数据行。 串行化(Serializable)则会对读的所有数据多加锁。 除了MVCC之外数据库还可以使用锁来实现隔离性。 锁的问题是锁的颗粒度以及时间问题,从锁的颗粒度来说,锁可以分为独占锁,读些锁,以及乐观锁等, 独uode独占锁锁住一个资源后其他线程无法访问同一个资源。但是部分应用的特点是读多写少,数据读取的时候互相排斥不是必要的。读写锁可以部分解决独占锁的问题,读锁和读锁之间不互斥,而写锁和写锁、读锁都互斥,这样就很大提升了系统的并发能力。但是即使使用读写锁,在资源被修改的期间数据也是不是读取的。 MVCC就提供了读写可以并发的方式,实现方案就是资源在修改期间,保存了之前的数据快照,数据读取时可以指定读取某个快照版本的数据,这样就避免了读锁就和写锁的冲突,不同的事务会话可以查询自己特定版本的数据。 MVCC除了解决读写阻塞的问题之外,还降低了死锁的概率,以及实现了一致读。 MVCC的实现需要三个模块,分别是数据快照,版本链,以及ReadView。 数据快照存储了数据的多个版本… |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库精选内容 |