{"id":1111,"date":"2010-11-09T23:59:15","date_gmt":"2010-11-09T15:59:15","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=1111"},"modified":"2013-05-21T20:52:18","modified_gmt":"2013-05-22T03:52:18","slug":"datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/","title":{"rendered":"DataSnap \u2013 Compartilhando conex\u00e3o com o banco entre diferentes Server Classes a partir do mesmo cliente (Session)"},"content":{"rendered":"<p>Aqueles que come\u00e7am a desenvolver aplica\u00e7\u00f5es utilizando DataSnap tem como h\u00e1bito definir conex\u00f5es ao banco de dados por Data Module, isso gera um volume muito grande de conex\u00f5es ao banco de dados, dependendo da situa\u00e7\u00e3o isso pode se tornar um problema.<\/p>\n<p>No <a href=\"www.embarcadero.com\/products\/delphi\" target=\"_blank\">Delphi XE<\/a> o DataSnap traz o gerenciamento de sess\u00e3o (Session Management), este gerenciamento facilita a implementa\u00e7\u00e3o do servidor em diversos aspectos, especificamente tratando do tema de como definir uma \u00fanica conex\u00e3o ao banco de dados para cada cliente onde cada Server Methods receba esta conex\u00e3o, o gerenciamento de sess\u00e3o \u00e9 o ponto chave pra isso.<\/p>\n<p>A defini\u00e7\u00e3o deste controle ir\u00e1 ocorrer do lado servidor, a aplica\u00e7\u00e3o cliente n\u00e3o precisa e n\u00e3o tem que saber como ocorre a conex\u00e3o ao banco de dados.<\/p>\n<p>Ao criar um servidor DataSnap como boa pr\u00e1tica definimos um Server Container (Data Module) que basicamente \u00e9 o seu servidor DataSnap, \u00e9 neste container que ser\u00e1 definido o m\u00e9todo respons\u00e1vel por passar a cada Server Class a conex\u00e3o com o banco, assim sendo, a implementa\u00e7\u00e3o seria.<\/p>\n<p>Primeiro, o m\u00e9todo GetConnection retornar\u00e1 a conex\u00e3o ao banco, neste m\u00e9todo teremos a l\u00f3gica respons\u00e1vel por saber se a conex\u00e3o existe ou n\u00e3o para aquele cliente conectado, cada cliente ao conectar so servidor DataSnap ter\u00e1 um ID de sess\u00e3o associado, assim declaramos o m\u00e9todo e a vari\u00e1vel ListofConnection como parte do nosso Server Container.<\/p>\n<pre class=\"brush: delphi\">  private\r\n    { Private declarations }\r\n    ListofConnection : TDictionary;\r\n  public\r\n    function GetConnection : TSQLConnection;<\/pre>\n<p>O m\u00e9todo GetConnection ir\u00e1 consultar o pool de conex\u00f5es (vari\u00e1vel ListOfConnection) para saber se este cliente j\u00e1 tem uma conex\u00e3o no pool ou n\u00e3o, atrav\u00e9s do TDSSessionManager.GetThreadSession.Id obtemos o Id da sess\u00e3o para este cliente, este Id \u00e9 \u00fanico e somente ser\u00e1 renovado se o cliente desconectar e voltar a conectar novamente ao servidor.<\/p>\n<p>N\u00e3o existindo a conex\u00e3o para o cliente naquele sess\u00e3o, ser\u00e1 criada dinamicamente uma conex\u00e3o e esta ser\u00e1 retornada.<\/p>\n<pre class=\"brush: delphi\">function TServerContainer1.GetConnection: TSQLConnection;\r\nvar\r\n  dbconn : TSQLConnection;\r\nbegin\r\n\r\n  if ListofConnection.ContainsKey(TDSSessionManager.GetThreadSession.Id) then\r\n     Result := ListofConnection[TDSSessionManager.GetThreadSession.Id]\r\n  else\r\n  begin\r\n    dbconn := TSQLConnection.Create(nil);\r\n    dbconn.Params.Clear;\r\n    dbconn.LoadParamsOnConnect := true;\r\n    dbconn.ConnectionName := 'DS Employee';\r\n\r\n    ListofConnection.Add(TDSSessionManager.GetThreadSession.Id, dbconn);\r\n    Result := dbconn;\r\n  end;\r\n\r\nend;<\/pre>\n<p>A partir de agora precisamos informar a cada Server Class qual conex\u00e3o utilizar. Se o seu Server Class tem como base um DataModule, basta no onCreate do DataModule informar a conex\u00e3o que dever\u00e1 ser utilizada nos objetos TSQLQuery ou outro objeto que conecte ao banco de dados.<\/p>\n<p>Como exemplo, tenho um DataModule como Server Class, neste existem 2 SQLQuery, assim sendo passo a conex\u00e3o para cada uma deles:<\/p>\n<pre class=\"brush: delphi\">  COUNTRYQuery.SQLConnection := ServerContainer1.GetConnection;\r\n  EMPLOYEE1Query.SQLConnection := ServerContainer1.GetConnection;<\/pre>\n<p>Para n\u00e3o deixar conex\u00f5es abertas no servidor assim que um cliente desconectar do servidor DataSnap, implementamos no evento onDisconnect do componente DSServer o seguinte m\u00e9todo:<\/p>\n<pre class=\"brush: delphi\">  if GetConnection &lt;&gt; nil then\r\n     GetConnection.Close;<\/pre>\n<p>Este m\u00e9todo ir\u00e1 fechar a conex\u00e3o com o banco.<\/p>\n<p>O c\u00f3digo fonte completo est\u00e1 dispon\u00edvel no <a href=\"http:\/\/cc.embarcadero.com\/item\/28097\" target=\"_blank\">Code Central<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aqueles que come\u00e7am a desenvolver aplica\u00e7\u00f5es utilizando DataSnap tem como h\u00e1bito definir conex\u00f5es ao banco de dados por Data Module, isso gera um volume muito grande de conex\u00f5es ao banco de dados, dependendo da situa\u00e7\u00e3o isso pode se tornar um problema. No Delphi XE o DataSnap traz o gerenciamento de sess\u00e3o (Session Management), este gerenciamento [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[102],"tags":[23,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DataSnap \u2013 Compartilhando conex\u00e3o com o banco entre diferentes Server Classes a partir do mesmo cliente (Session) | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Aqueles que come\u00e7am a desenvolver aplica\u00e7\u00f5es utilizando DataSnap tem como h\u00e1bito definir conex\u00f5es ao banco de dados por Data Module, isso gera um volume\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DataSnap \u2013 Compartilhando conex\u00e3o com o banco entre diferentes Server Classes a partir do mesmo cliente (Session) | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Aqueles que come\u00e7am a desenvolver aplica\u00e7\u00f5es utilizando DataSnap tem como h\u00e1bito definir conex\u00f5es ao banco de dados por Data Module, isso gera um volume\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-09T15:59:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-22T03:52:18+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"170\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"3 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"width\":170,\"height\":170},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/\",\"name\":\"DataSnap \\u2013 Compartilhando conex\\u00e3o com o banco entre diferentes Server Classes a partir do mesmo cliente (Session) | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#primaryimage\"},\"datePublished\":\"2010-11-09T15:59:15+00:00\",\"dateModified\":\"2013-05-22T03:52:18+00:00\",\"description\":\"Aqueles que come\\u00e7am a desenvolver aplica\\u00e7\\u00f5es utilizando DataSnap tem como h\\u00e1bito definir conex\\u00f5es ao banco de dados por Data Module, isso gera um volume\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"DataSnap \\u2013 Compartilhando conex\\u00e3o com o banco entre diferentes Server Classes a partir do mesmo cliente (Session)\",\"datePublished\":\"2010-11-09T15:59:15+00:00\",\"dateModified\":\"2013-05-22T03:52:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#webpage\"},\"commentCount\":19,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#primaryimage\"},\"keywords\":[\"DataSnap\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-compartilhando-conexao-com-o-banco-entre-diferentes-server-classes-a-partir-do-mesmo-cliente-session\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1111"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=1111"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1111\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/4202"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=1111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=1111"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=1111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}