From 791b0b0066e53c3c16e00dae055197c7c9b37aa3 Mon Sep 17 00:00:00 2001 From: Amanda <88412207+AmandaSerpa@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:12:46 -0300 Subject: [PATCH] Object Pool --- bib/bib.md | 123 +++++++++++++++++++++++++- posts/ObjectPool.md | 211 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 330 insertions(+), 4 deletions(-) create mode 100644 posts/ObjectPool.md diff --git a/bib/bib.md b/bib/bib.md index a43ea3a7..dbd6f7d7 100644 --- a/bib/bib.md +++ b/bib/bib.md @@ -1,9 +1,124 @@ -[^BACKES]: Linguagem C - Completa e Descomplicada Capa comum, 2018, André Backes +[^Pires]:Jackson Pires .O que é Programação Orientada a Objetos e porque você precisa saber!https://becode.com.br/programacao-orientada-a-objetos-poo/. (Acessado em 15/08/2019) -[^SOFFNER]: Algoritmos e programação em linguagem C, 2013, Renato Soffner +[^Tedesco]:Kennedy Tedesco. Linguagens e paradigmas de programação - Blog da TreinaWeb.https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/. (Acessado em 07/08/2019). +[^Deitel]:P.D. DEITEL e H. Deitel.JAVA: como programar.Pearson Educación, 2016.ISBN: 9786073238038. -[^LAPASINI]: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I - Professora Me. Gislaine Camila Lapasini Leal - Unicesumar. +[^Dornelles]:Nemora Dornelles.As 15 principais linguagens de programação do mundo! | Becode.https://becode.com.br/principais-linguagens-de-programacao/. (Acessado em 15/08/2019). -[^MANZANO]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica. \ No newline at end of file +[^Oracle]:Oracle."Hello World!" for Microsoft Windows (The Java™Tutorials > Getting Started> The "Hello World!" Application).[https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html](https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html). (Acessado em 07/08/2019). + +[^Santos]:R. Santos.Introdução à programação orientada a objetos usando Java. Campus, 2003.ISBN:9788535212068. + +[^Forbellone]:Forbellone, A. and Eberspacher, H., 2000. Lógica De Programação. Sao Paulo: Makron Books. + +[^Ascencio]: Ascencio, A. and Campos, E., 2008. Fundamentos Da Programação De Computadores. São Paulo: Pearson Prentice Hall. + +[^Salvetti]: Salvetti, D. and Barbosa, L., 1998. Algoritmos. São Paulo: Makron Books. + +[^Farrer]: Farrer, H., 1999. Algoritmos Estruturados. Rio de Janeiro: LTC Editora. + +[^Manzano]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica. + +[^GAMMA]: GAMMA, Erich. et al. Padrões de projetos: Soluções reutilizáveis de software orientados a objetos Bookman editora, 2009. + +[^Alexander]: Alexander, Christopher. A pattern language: towns, buildings, construction. Oxford university press, 1977. + +[^WikAntipadrao]: Antipadrão. [https://pt.wikipedia.org/wiki/Antipadr%C3%A3o](https://pt.wikipedia.org/wiki/Antipadr%C3%A3o). (Acessado em 15/03/2022) + +[^RobsonSRP]:Robson Castilho. Princípio da Responsabilidade Única (SRP) [https://robsoncastilho.com.br/2013/02/06/principios-solid-principio-da-responsabilidade-unica-srp/](https://robsoncastilho.com.br/2013/02/06/principios-solid-principio-da-responsabilidade-unica-srp/). (Acessado em 15/03/2022) + +[^RobsonOCP]:Robson Castilho. Princípio do Aberto/Fechado (OCP) [https://robsoncastilho.com.br/2013/02/23/principios-solid-principio-do-abertofechado-ocp/](https://robsoncastilho.com.br/2013/02/23/principios-solid-principio-do-abertofechado-ocp/). (Acessado em 15/03/2022) + +[^JoaoRobertoSOLID]:João Roberto da Paixão.O que é SOLID: O guia completo para você entender os 5 princípios da POO.[https://medium.com/desenvolvendo-com-paixao/o-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530](https://medium.com/desenvolvendo-com-paixao/o-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530) (Acessado em 18/03/2022) + + +[^guru]:Prototype. Refactoring Guru. Disponível em: [https://refactoring.guru/pt-br/design-patterns/prototype](https://refactoring.guru/pt-br/design-patterns/prototype). Acesso em: 07 de abril de 2022. + +[^K19]: K19. Design Patterns em Java. 2012 + + +[^Ascencio]: Ascencio, A. and Campos, E., 2008. Fundamentos Da Programação De Computadores. São Paulo: Pearson Prentice Hall. + +[^caelumoo]: Caelum. Java e Orientação a Objetos - Curso fj-11. + +[^camel]: Oracle. Code Conventions for the Java Programming Language: 9. Naming Conventions [https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html](https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html) (Acessado em 17/07/2021) + +[^Deitel]:P.D. DEITEL e H. Deitel.JAVA: como programar, 10a Edição.Pearson, 2016. + + +[^Dornelles]:Nemora Dornelles.As 15 principais linguagens de programação do mundo! | Becode. [https://becode.com.br/principais-linguagens-de-programacao/](https://becode.com.br/principais-linguagens-de-programacao/). (Acessado em 15/08/2019). + +[^Farrer]: Farrer, H., 1999. Algoritmos Estruturados. Rio de Janeiro: LTC Editora. + +[^Forbellone]:Forbellone, A. and Eberspacher, H., 2000. Lógica De Programação. Sao Paulo: Makron Books. + +[^GAMMA]: GAMMA, Erich. et al. Padrões de projetos: Soluções reutilizáveis de software orientados a objetos Bookman editora, 2009. + +[^java16]: Oracle. Oracle Announces Java 16 [https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html](https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html) (Acessado em 15/07/2021) + +[^k19oo]: K19-Treinamentos. (2013). Orientação a Objetos em Java, 220. + +[^Manzano]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica. + +[^Oracle]:Oracle."Hello World!" for Microsoft Windows (The Java™Tutorials > Getting Started> The "Hello World!" Application). [https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html](https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html). (Acessado em 07/08/2019). + +[^Pires]:Jackson Pires .O que é Programação Orientada a Objetos e porque você precisa saber! [https://becode.com.br/programacao-orientada-a-objetos-poo/](https://becode.com.br/programacao-orientada-a-objetos-poo/). (Acessado em 15/08/2019) + +[^Salvetti]: Salvetti, D. and Barbosa, L., 1998. Algoritmos. São Paulo: Makron Books. + +[^Santos]:R. Santos.Introdução à programação orientada a objetos usando Java. Campus, 2003.ISBN:9788535212068. + +[^Takenami]: Takenami, Igor. Introdução a Programação Orientada a Objetos. Salvador. 2011. (Apostila). + +[^Tedesco]:Kennedy Tedesco. Linguagens e paradigmas de programação - Blog da TreinaWeb. [https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/](https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/). (Acessado em 07/08/2019). + +[^Bacala]:Bacalá, Sílvio. Página do Professor Sílvio Bacalá Júnior. [http://www.facom.ufu.br/~bacala/POO/](http://www.facom.ufu.br/~bacala/POO/) + +[^UFF]: Leandro A. F. Fernandes, Marcos Lage, Isabel Rosseti. 2ª Lista de Exercícios Orientação a Objetos. Universidade Federal Fluminense, Instituto de Computação, Departamento de Ciência da Computação, Programação de Computadores II + +[^Jenkov]:Jakob Jenkov. Tutorials for Software Developers and Technopreneurs! [http://tutorials.jenkov.com/](http://tutorials.jenkov.com/). (Acessado em 03/11/2021) + + +[^DevMediaEve]:Thiago. Trabalhando com eventos na GUI do Java [https://www.devmedia.com.br/trabalhando-com-eventos-na-gui-do-java/25898](https://www.devmedia.com.br/trabalhando-com-eventos-na-gui-do-java/25898). (Acessado em 23/09/2022) + + +[^DevMediaConv]:Conversões em Java [https://www.devmedia.com.br/conversoes-em-java/2695](https://www.devmedia.com.br/conversoes-em-java/2695). (Acessado em 05/10/2022) + +[^AluraColl]: Java Collections: Dominando Listas, Sets e Mapas. [https://www.alura.com.br/conteudo/java-collections--amp](https://www.alura.com.br/conteudo/java-collections--amp). (Acessado em 21/10/2022) + + +[^ExercitandoUML]: Melo, Ana Cristina. Exercitando Modelagem em Uml. ISBN-10: 8574522546 + + +[^IBM]:IBM Cloud Education. Arquitetura de três camadas (tiers). [https://www.ibm.com/br-pt/cloud/learn/three-tier-architecture](https://www.ibm.com/br-pt/cloud/learn/three-tier-architecture). (Acessado em 01/02/2023) + + + +[^JakartaEE]:The Jakarta EE Tutorial. Distributed Multitiered Applications [https://eclipse-ee4j.github.io/jakartaee-tutorial/#distributed-multitiered-applications](https://eclipse-ee4j.github.io/jakartaee-tutorial/#distributed-multitiered-applications). (Acessado em 01/02/2023) + + +[^JAVAGUIDES]:Three Tier (Three Layer) Architecture in Spring MVC Web Application.[https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html](https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html). (Acessado em 02/02/2023) + +[^IBMthree]:What is three-tier architecture?.[https://www.ibm.com/topics/three-tier-architecture](https://www.ibm.com/topics/three-tier-architecture). (Acessado em 02/02/2023) + + +[^STACKIFY_LSP]: Princípios de design SOLID explicados: o princípio de substituição de Liskov com exemplos de código. [https://stackify.com/solid-design-liskov-substitution-principle/](https://stackify.com/solid-design-liskov-substitution-principle/) + +[^JACKHISTON]: The Interface Segregation Principle. [https://jackhiston.com/2017/8/3/the-interface-segregation-principle/](https://jackhiston.com/2017/8/3/the-interface-segregation-principle/) + +[^MACORATTI_ISP]: Princípio Da Segregação da Interface(ISP). [https://www.macoratti.net/20/05/c_isp1.htm](https://www.macoratti.net/20/05/c_isp1.htm) + + +[^MACORATTI_DIP]: Princípio da Inversão da Dependência. [https://macoratti.net/20/05/c_invdep1.htm](https://macoratti.net/20/05/c_invdep1.htm) + +[^SourceMaking]: Object Pool Design Pattern. [https://sourcemaking.com/design_patterns/object_pool] + +[^ODesign]: Object Pool Pattern. [https://www.oodesign.com/object-pool-pattern] + +[^BestPratice]: Best Practice Software Engineering - Object Pool. [http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/objectpool.html] + +[^CsiUneb]: Object Pool - Padrões de Projeto. [http://www.csi.uneb.br/padroes_de_projetos/object_pool.html] + +[^Microsoft]: Reutilização de objeto com Object Pool no ASP.NET Core. [https://learn.microsoft.com/pt-br/aspnet/core/performance/objectpool?view=aspnetcore-7.0] \ No newline at end of file diff --git a/posts/ObjectPool.md b/posts/ObjectPool.md new file mode 100644 index 00000000..4915dce5 --- /dev/null +++ b/posts/ObjectPool.md @@ -0,0 +1,211 @@ +--- +icon: edit +date: 2023-04-20 20:10:00.00 -3 +tag: + - Object Pool +--- + +# Object Pool + + [^SourceMaking] + [^ODesign] + [^BestPratice] + [^CsiUneb] + [^Microsoft] + +## Intenção + +O Object Pool tem como objetivo reaproveitar objetos, criando pré-instancias de objetos que poderão ser solicitados a qualquer momento. + +## Também conhecido como + +Pool de Objetos + +## Motivação + +Por exemplo se trabalhamos com bancos de dados, o processo de criar uma conexão é uma operação cara e pode exigir muito tempo, isso pode vir a sobrecarregar o banco de dados, ou seja, abrir muitas conexões pode afetar o desempenho por diversos motivos, por isso nesse caso seria recomendado a utilização do padrão de projeto **object pool**, que já terá pools de conexões prontas, que poderão ser reutilizadas sempre que um cliente solicitar, sem ter a necessidade de destruir e criar uma nova. + +
+ +```plantuml +@startuml + class Connection{ + +Connection (database: String) + } + + class ConnectionImpl{ + } + + Connection ..> ConnectionImpl: usa + Connection --> ConnectionPool: pede pelo ConnectionImpl + + + class ConnectionPool{ + - reusables + +acquireConnectionImpl() + +releaseConnectionImpl() + } + + ConnectionImpl --o ConnectionPool + + + hide empty attributes + hide empty methods +@enduml +``` +
Exemplo Object Pool.
+
+ +Quando um cliente precisar consultar o banco de dados, ele poderá instanciar um novo objeto connection especificando o nome do banco de dados que irá chamar o método de consulta que deverá retornar um objeto, enquanto isso o pool executa as seguintes ações: +- Procura um objeto reutilizável disponível e caso seja encontrado será devolvido ao cliente. +- Se nenhum objeto reutilizável for encontrado, ele tenta criar um novo. Se esta ação for bem-sucedida, o novo objeto reutilizável será retornado ao cliente. +- Se o pool não conseguir criar um novo objeto reutilizável, ele aguardará até que um objeto reutilizável seja liberado. + +**Connection** - Representa o objeto que é instanciado pelo cliente. Da perspectiva do cliente, este objeto é criado e manipula as operações do banco de dados, é o único objeto visível para o cliente. O cliente não sabe que usa algumas conexões compartilhadas. + +**ConnectionImpl** - É o objeto que implementa as operações de banco de dados que são expostas por Connection para o cliente. + +**ConnectionPool** - É o que gerencia as conexões com o banco de dados. Ele mantém uma lista de objetos ConnectionImpl e instancia novos objetos, se necessário. + +Lembrando que o cliente é responsável por solicitar o objeto reutilizável, bem como liberá-lo para o pool. Caso esta ação não seja realizada o objeto reutilizável será perdido, sendo considerado indisponível pelo ResourcePool. + + +## Aplicabilidade + +Use o padrão Object Pool quando: + +- Possuir objetos com alto custo e/ou tempo de criação; +- Os objetos que estão sendo usados podem ser reaproveitados; +- Os objetos forem intânciados com muita frequência, ou seja, várias partes do seu aplicativo requerem os mesmos objetos em momentos diferentes. + + +## Estrutura + +
+ +```plantuml +@startuml +class Cliente{ +} + +class Reusable{ +} + +Cliente ..> Reusable: usa +Cliente --> ReusablePool: pede pelo Reusable + + +class ReusablePool{ + - reusables + +acquireReusable() + +releaseReusable() + +setMaxPoolSize(maxSize : int) +} + +Reusable --o ReusablePool + + +hide empty attributes +hide empty methods +@enduml +``` + +
Estrutura Object Pool.
+
+ + +## Participantes + +- **Reusable** (ConnectionImpl) + - Instâncias dessa classe colaboram com outros objetos por um período de tempo limitado, onde serão compartilhados por vários clientes por um período de tempo limitado e então não são mais necessárias para essa colaboração +- **Cliente** (Connection) + - Instâncias dessa classe usam os obejtos reutilizaveis (Reusable Objects). +- **ReusablePool** (ConnectionPool) + - Instâncias dessa classes gerenciam os objetos reutilizáveis ​​para utilização pelos clientes, criando e manuseando uma pool de objetos. + + +## Colaborações + +- O cliente interage com o ReusablePool, para solicitar através do método AcquireReusable() o objeto que deseja utilizar (reusable), o ReusablePool verifica se existe alguma intância do objeto disponivel na pool no momento, e caso tenha, devolve para o cliente e altera o status daquele objeto para "indisponível", assim ele tem o controle que aquele objeto não pode ser emprestado novamente, até que seja devolvido pelo cliente através do método releaseReusable(), no qual ele coloca o reusable (objeto que foi emprestado) novamente na pool e altera seu status para "disponivel" até o momento que for solicitado novamente. + +## Consequências + +O padrão Object Pool tem os seguintes benefícios e desvantagens: + +- **Benefícios** + + - Oferece um aumento no desempenho. + - Consegue gerenciar as conexões e fornece uma maneira de reutiliza-las e compartilha-las. + - Pode fornecer o limite para o número máximo de objetos que podem ser criados. + - Oferece a possibilidade de alterar o tamanho da pool + +- **Desvantagens** + + - Como existe um limite de objetos na pool, pode ocorrer falta de objetos disponiveis. + - Para que o objeto volte para a pool, o cliente que o estava utilizando, precisa libera-lo, caso não o faça o objeto será perdido e não voltará para a pool. + - Pode ocorrer falhas na politica de aquisição e criação dos recursos. + - A posibilidade de alterar o tamanho da pool também pode gerar alguns problemas, como destruir objetos que estão em uso (caso o tamanho da pool seja diminuido) + +## Implementação + + + + + + + +## Exemplo de código + + + +```java +public class Peca { + + private int idPeca; + private boolean disponivel; + + public Peca(int idPeca) { + + this.idPeca = idPeca; + this.disponivel = true; + } + + public void setDisponibilidade(boolean disponibilidade) { + this.disponivel = disponibilidade; + } + + public boolean getDisponibilidade() { + return this.disponivel; + } +} +``` + +```java +public class Monte { + + private List pool_de_pecas; + + public Peca pegarPeca() { + // disponibiliza a peça para o cliente solicitado + } + + public void liberarPeca() { + // o cliente devolve a peça, e ela volta para a lista + } + +} +``` +## Usos conhecidos + +O ASP.NET Core utiliza o padrão de projeto **object pool** para fazer a reutilização de objetos. É utilizado uma pool de objetos em alguns locais para reutilizar instâncias de StringBuilder, que servem para alocar e gerenciar seus próprios buffers para armazenar dados de caracteres. A ASP.NET Core usa StringBuilder regularmente para implementar recursos, e reutilizá-los oferece um benefício de desempenho. + + +## Padrão relacionados + +***Factory Method*** : O padrão Factory Method pode ser usado para encapsular a lógica de criação de objetos. No entanto, ele não os gerencia após sua criação, o padrão de object pool rastreia os objetos que ele cria. + +***Singleton*** : Object Pools geralmente são implementados como Singletons. + +## Referências + +@include(../bib/bib.md) \ No newline at end of file