Clipper On Line • Ver Tópico - Reaproveitamento de conexão MySQL
Página 1 de 4

Reaproveitamento de conexão MySQL

MensagemEnviado: 20 Abr 2017 18:05
por cjp
Tenho usado MySQL há cerca de 2 anos, sempre fazendo assim:

1) conecto ao banco de dados com RDDINFO
2) executo a query
3) desconecto

Acontece que meu sistema faz isso o tempo todo, são várias conexões seguidas. E isso tem me gerado alguns problemas, pois às vezes, não sei porquê, a conexão não se desfaz. Daí estoura o número de conexões no provedor.

Pelo que estive pesquisando, é possível usar uma mesma conexão para executar várias querys seguidas, inclusive com a vantagem de o procedimento ganhar velocidade. Pelo que eu entendi, seria algo assim:

1) conecta ao banco de dados
2) executa a query 1
3) executa a query 2
4) executa a query 3
....
x) desconecta

A minha dúvida é: isso funciona bem assim? Existe algum risco nesse procedimento? Resolveria o meu problema de excesso de conexões? Essa mesma conexão poderia ficar ativa durante horas em que o sistema é utilizado? Pelo que vi, o meu provedor tem um timeout para conexões de 7200s (o que daria 2 horas), mas parece que esse tempo seria só para conexão inativa, certo? Se a conexão ficar sendo usada o tempo todo, não haveria problema, correto?

Reaproveitamento de conexão MySQL

MensagemEnviado: 20 Abr 2017 19:24
por alxsts
Olá!

cjp escreveu:é possível usar uma mesma conexão para executar várias querys seguidas,


Não conheço e nunca usei RDDINFO.

Sei que isto é possível usando-se ADO. Já usei e funciona.

Reaproveitamento de conexão MySQL

MensagemEnviado: 21 Abr 2017 00:07
por cjp
Estranhamente, não estou conseguindo fazer isso.

Quando saio da função que executa a query, ao voltar, não consigo usar a mesma conexão.

Tem algum jeito de forçar o uso da mesma conexão?

Reaproveitamento de conexão MySQL

MensagemEnviado: 21 Abr 2017 21:22
por JoséQuintas
O Windows tem vários limites de tempo.
Tem tempo pra conexão ociosa, tempo pra terminal ocioso, etc.
Alguns ficam executando querys a cada intervalo de tempo só pra manter a conexão ativa.
E se a conexão é externa, tem também o risco de cair internet.

Pelo menos em ADO, é assim que uso: uma única conexão, aberta ao iniciar o aplicativo, e fechada no final.

Reaproveitamento de conexão MySQL

MensagemEnviado: 21 Abr 2017 21:31
por cjp
Entendi. Mas, no caso, eu verifiquei que a conexão está ativa ainda. Só que não sei como usá-la. Da forma como está minha aplicação, ela abre automaticamente nova conexão, deixando a anterior ativa. Como evito isso?

Reaproveitamento de conexão MySQL

MensagemEnviado: 27 Abr 2017 16:56
por Toledo
Inácio, faz o que o JoséQuintas falou, faz a conexão apenas uma vez no início do programa (no PRG principal/inicial) e só desconecta quando for finalizar o programa. Ai quando for executar as querys, não precisa conectar novamente, apenas construa a query e execute ela.

Abraços,

Reaproveitamento de conexão MySQL

MensagemEnviado: 27 Abr 2017 17:21
por cjp
Então, é isso que estou tentando fazer, mas, não sei porquê, não estou conseguindo.

Tenho uma função específica para executar as querys com update, outra específica para fazer select. Ambas chamam a função de conexão. Atualmente, elas conectam chamando a função de conexão, executam as suas querys, depois desconectam.

Daí tentei fazer como ele disse: conectar uma só vez no início, depois executar as querys diretamente, sem nova conexão, retirando a chamada à função de conexão das duas funções anteriores e retirando também a desconexão no final delas. Mas daí dá erro por falta de conexão.

O mais estranho é que, aparentemente, permanece a conexão ativa. Tanto é que, tentando fazer nova conexão, o número da nova conexão é o próximo em sequência, não é o mesmo anterior.

Estou fazendo assim para testar:

function testesdiversos

private nConnection
   
nConnection :=conecta(1)
   
do while .t.
   if dbsel("select * from tarefas where nrtarefa='Z800'","testesd",1)>0
      ?nConnection
   endif   
enddo      


A função dbsel é a que executa o select:

function dbsel(sel,nmbs,nServidor)
         local nvz :=1
       local sair :="N"
       private cMessage
       if nmbs=NIL
          nmbs=procname(1)
        endif
         do while .t.
          if nvz>1 .and. ("gone away"$cMessage .or. "Not connected"$cMessage .or. "abertura"$cMessage)
            nConnection=conecta(nServidor)
         endif
         if nConnection=0
            return 0
         endif
            bError := ErrorBlock( {|e| Break(e) } )
            begin sequence
               use
                  dbusearea(.f.,,sel,nmbs+substr(time(),4,2))
               sair="S"
            recover using e
                  RDDSETDEFAULT("DBFNTX")
              nvz++
                 cMessage := ErrorMessage(e)
                if at("Lost connection",cMessage)=0 .and. at("Unable to get error",cMessage)=0 .and. at("Erro de abertura",cMessage)=0
                    logerro()
               endif
              if nvz>2
                     mandmail1("error.log","Erro no dbsel contornado com o recover do begin sequence: "+cmessage)
                 return 0
               endif
            endsequence
            ErrorBlock( bError )
         if sair="S"
            exit
         endif
       enddo
         RDDSETDEFAULT("DBFNTX")
       fAtiva=.f.
return nConnection


Note que, teoricamente, era pra ela executar diretamente o Select, pois a conexão já foi feita antes de ela ser chamada, mas ela não está executando, tá dando o erro, daí eu trato o erro fazendo nova conexão.

O que eu estou fazendo errado?

Reaproveitamento de conexão MySQL

MensagemEnviado: 27 Abr 2017 23:31
por JoséQuintas
Rotina inexplicável.
Não uso isso, mas por acaso não dá pra fazer um teste assim:

FUNCTION TestesDiversos()

   LOCAL nCont, lOk, nConnection

   nConnection := conecta( 1 )

   FOR nCont = 1 TO 10
      lOk := .F.
      BEGIN SEQUENCE WITH __BreakBlock()
         dbUseArea( .F.,, "SELECT * FROM TAREFAS WHERE NRTAREFA='Z800'" )
         lOk := .T.
      END SEQUENCE
      USE
      ? "SELECT " + iif( lOk, "OK", "COM ERRO" )
   NEXT
   
   RETURN

Reaproveitamento de conexão MySQL

MensagemEnviado: 28 Abr 2017 02:56
por cjp
Entendi a lógica do teu exemplo e testei. Era pra funcionar, mas está dando SELECT COM ERRO.

O conecta retornou 1, ou seja, foi conectado. Não era pra funcionar?

Reaproveitamento de conexão MySQL

MensagemEnviado: 28 Abr 2017 07:27
por JoséQuintas
Então reduza mais ainda pra ver qual é o erro.

FUNCTION TestesDiversos()

LOCAL nCont, nConnection

nConnection := conecta( 1 )

FOR nCont = 1 TO 10
    dbUseArea( .F.,, "SELECT * FROM TAREFAS WHERE NRTAREFA='Z800'" )
   USE
NEXT

RETURN

Reaproveitamento de conexão MySQL

MensagemEnviado: 28 Abr 2017 09:28
por JoséQuintas
Comentário:

Mesmo que a conexão funcione, precisa ver se o select está certo, se o usuário tem direito de acesso a essa tabela, etc.

Além disso, não sei exatamente nesse seu uso, se precisa algo mais.

Uma coisa é o MySQL, outra coisa é o Harbour, e outra coisa é o componente usado pra trabalhar com MySQL no Harbour.

Problema de Harbour, quem com Harbour sabe.
Problema de MySQL, quem com MySQL sabe.
Problema com esse componente: só quem usa esse mesmo componente, o que restringe a quem usar Harbour + MySQL + esse componente..

Deixe que apareçam as mensagem de erro, pra pelo menos saber do que se trata o erro.

Reaproveitamento de conexão MySQL

MensagemEnviado: 28 Abr 2017 23:56
por cjp
Descobri o erro, muito elementar: no teu exemplo, o nome da tabela estava com maiúsculas, na base de dados está em minúsculas, daí deu tabela inexistente.

Corrigi e funcionou. Inclusive funcionaram os vários selects com uma só conexão.

Depois de vários testes, descobri também porque não estava funcionando na minha função dbsel() e já resolvi o problema.

Obrigado pela ajuda.

Mas me resta um problema: meu provedor atual tem umas restrições complicadas de tamanho e, por causa disso, eu tive que separar minhas tabelas em vários bancos de dados. E o pior é que em cada banco de dados tem um usuário diferente, pois o provedor não permite que eu escolha o nome dos usuários, ele mesmo que atribui o nome. Assim, eu tenho que ter uma conexão diferente para cada banco de dados, com um total de 4 conexões diferentes, que são usadas alternativamente em todo o sistema.

A pergunta é: tem como ficar conectado nos 4 bancos ao mesmo tempo? E como eu faria para escolher a conexão de acordo com o banco que será usado?

Reaproveitamento de conexão MySQL

MensagemEnviado: 29 Abr 2017 08:40
por JoséQuintas
Até tem jeito, mas se for relacionar uma tabela com a outra, não vai conseguir.

Se for provedor pago, troque de provedor.

Reaproveitamento de conexão MySQL

MensagemEnviado: 29 Abr 2017 09:49
por cjp
E pago sim, mas este é o melhor provedor de todos os que já testei. E o acesso mais rápido e confiável (com menos falhas). Por isso, por hora, não estou considerando trocar. Sem prejuízo de testar outros que me indicarem.

Não pretendo relacionar tabelas, apenas usar varias ao mesmo tempo. Poderia me indicar como fazer isso?

Reaproveitamento de conexão MySQL

MensagemEnviado: 29 Abr 2017 10:35
por Toledo
cjp escreveu:tem como ficar conectado nos 4 bancos ao mesmo tempo? E como eu faria para escolher a conexão de acordo com o banco que será usado?

Sim, você pode conectar em vários banco de dados. Agora para escolher a conexão, veja o último parâmetro da função DbUseArea:

DbUseArea( [<lNewArea>] , ;
[<cRddName>] , ;
<cDatabase> , ;
[<cAlias>] , ;
[<lShared>] , ;
[<lReadonly>] , ;
[<cCodePage>] , ;
[<nConnection>] )
...
<nConnection>
This parameter specifies a numeric server connection handle. It is returned by a server connection function which establishes a connection to a database server, such as SR_AddConnection() of the xHarbour Builder SQLRDD. When <nConnection> is passed, the function opens a database on the server.


Abraços,

Reaproveitamento de conexão MySQL

MensagemEnviado: 29 Abr 2017 11:47
por JoséQuintas
Não pretendo relacionar tabelas, apenas usar varias ao mesmo tempo. Poderia me indicar como fazer isso?


Estranha a pergunta.
Se sabe conectar um, sabe conectar mais de um, seria do mesmo jeito.

Qual o limite?

Tem http://www.kinghost.com.br, o limite é o valor conforme o plano, o menor é 5GB pra MySql.

Mais que isso pode compensar um servidor próprio.

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 02:43
por cjp
Na verdade minha pergunta não foi como conectar em várias bases de dados, isso eu já faço. A pergunta foi como usar ao mesmo tempo as várias conexões. A resposta do Toledo responde à minha pergunta. Muito obrigado. Vou testar e depois posto o resultado, mas acho que dará certo.

Meu provedor é justamente o Kinghost mesmo. Todas as minhas tabelas somam bem mais de 5 GB. Por isso as dividi em 3 bancos de dados diferentes.

Servidor próprio eu acharia uma ótima solução, já até tentei. O problema é que minha internet (Copel de fibra ótica) não tem IP fixo, o que (ao que eu sei), impede o acesso externo.

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 05:23
por JoséQuintas
Algumas operadoras bloqueiam o acesso a determinadas portas.
A saída seria usar uma porta alternativa.
Minha conexão é ip dinâmico, e é onde está meu servidor.

É que subiu bastante o preço de revenda na King Host, porque agora só tem o plano III disponível.
Meu plano é antigo, plano I, são 30GB pra usar como quiser, até mesmo tudo pra MySQL.
Mas continuo usando meu próprio servidor pra maioria das coisas.

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 15:40
por cjp
Como vc consegue fazer acesso externo com ip dinâmico?

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 16:10
por JoséQuintas
no-ip.org
Se cadastra lá, baixa o programa, e deixa rodando no seu servidor.
Uma vez por mês precisa confirmar, caso use grátis, eles te mandam um email avisando, com o link de confirmação.
Estou assim há muitos anos.

já usei speedy Vivo/Telefônica IP fixo 2MB upload 0.5MB, Vivo/Telefônica IP dinâmico 2MB upload 0.5MB, NET ip dinâmico 10MB upload 1MB, e no momento TIM fibra ótica IP dinâmico 35MB upload 20MB.

Também uso pra remoto.
Geralmente vou no cliente apenas com um caderno e caneta, e uso minha máquina remotamente, se necessário.

É tudo configurado no roteador, pra desviar pro servidor ou pra minha máquina, conforme a porta de entrada, apesar de tudo é algo relativamente comum.
E posso até usar pelo meu celular, apesar de tela muito pequena e teclado sem comparação a um comum.

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 20:35
por cjp
Cadastrei-me, mas não sei qual programa baixar. Daria pra me dar o caminho para fazer isso?

Como vc se conecta à sua máquina remotamente? Eu uso o Teamviewer pra isso, mas ele não funciona muito bem. Vc tem alguma forma melhor?

Reaproveitamento de conexão MySQL

MensagemEnviado: 01 Mai 2017 23:08
por JoséQuintas
Desde os tempos do Windows XP, ele tem a área de trabalho remota.
Isso é pra acessar a máquina de fora.
Basta ir lá em propriedades de meu computador, e marcar pra liberar acesso remoto.

Quanto ao programa do no-ip, está em suporte, download.
Ele só serve pra atualizar sozinho o ip que fica lá na internet, nada mais.

https://www.noip.com/download?page=win

Vai colocar seu email e senha, e o nome que cadastrou lá como sendo seu endereço.
Pode marcar a opção pra rodar como serviço, assim ele carrega automático quando ligar o computador, sem precisar fazer o login.

Ah, sim.... em qualquer máquina com Windows, em acessórios, tem o programa pra acessar a área de trabalho remota.
Também conhecido como Remote Desktop, que também tem pra baixar em celulares com Android - isso mesmo, acessar seu computador pelo telefone celular.
Tudo grátis da Microsoft.

Reaproveitamento de conexão MySQL

MensagemEnviado: 02 Mai 2017 00:31
por cjp
Instalei. Ficou um programa com nome de DUC v4.1.1 aberto. É isso, né?

Daí é só usar o "conexão de área de trabalho remota" em outro computador para acessar o meu? Ele pede um nome de computador, qual seria? Testei com o nome que coloquei no no-ip, mas acho que não é isso, né?

Com Iphone não dá pra acessar? O TV permite acesso pelo Iphone, mas teclado e tamanho de tela são terríveis.

Reaproveitamento de conexão MySQL

MensagemEnviado: 02 Mai 2017 08:04
por JoséQuintas
Pelo menos agora acaba sendo o mesmo assunto do MySql.

O nome da sua máquina, para MySQL ou remoto, pode variar.

Internamente, na mesma rede, o nome da máquina é o nome cadastrado como sendo do computador, ou o IP dele.

Pela internet vai estar acessando o modem/roteador, será seu IP externo.

Aí que entra no-ip.org: ao acessarem seu endereço no-ip, ele vai desviar para o seu ip externo, que estará lá cadastrado.
O programa DUC apenas vai manter esse cadastrado atualizado, informando seu IP sempre que ele alterar.

Só resta também alterar no seu modem/roteador, pra desviar as entradas de MySQL e remoto pra sua máquina e/ou pra o servidor MySql. Cada modem/roteador tem um um estilo de menus, procure por NAT ou port-forwarding.
E se o firewall do windows não liberar acesso automático na configuração, vai ter que liberar manualmente.

Reaproveitamento de conexão MySQL

MensagemEnviado: 07 Mai 2017 02:00
por cjp
Complicou. Mexer no setup do modem é uma coisa que pra mim não é nada fácil.

Procurei mas não achei essas opções mencionadas. No anexo coloquei a foto do meu setup, se vc puder me ajudar a achar ficarei grato.

Aproveito para postar que, em princípio, deu certo a utilização de várias conexões ao mesmo tempo. Agradeço ao Toledo pela dica.

Reaproveitamento de conexão MySQL

MensagemEnviado: 08 Mai 2017 18:43
por cjp
Toledo (ou demais colegas), poderia postar a sintaxe da RDDI_EXECUTE? Preciso saber como faço para usá-la invocando uma conexão já aberta, à semelhança do que fiz no dbusearea, de acordo com a sintaxe fornecida pelo Toledo.

Reaproveitamento de conexão MySQL

MensagemEnviado: 09 Mai 2017 08:41
por Toledo
Amigo, antes de usar o RDDI_EXECUTE, você tem que selecionar a conexão:

RDDINFO(RDDI_CONNECTION,,,nConnection2)


Abraços,

Reaproveitamento de conexão MySQL

MensagemEnviado: 10 Mai 2017 00:28
por cjp
Deu certo, obrigado.

Reaproveitamento de conexão MySQL

MensagemEnviado: 18 Mai 2017 17:20
por cjp
É possível saber se essa seleção da conexão da conexão funcionou ou não?

Notei que a RDDINFO(RDDI_CONNECTION,,,nConnection2) sempre retorna zero, correto?

Normalmente ela funciona, mas em alguns casos, não sei porquê, não dá certo.

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Mai 2017 07:55
por Toledo
Inácio, não sei responder as suas dúvidas deste tópico. Praticamente não existe nenhuma documentação falando sobre RDDI_CONNECTION, então fica difícil dizer com certeza qual seria o retorno da função, a melhor forma é mesmo testando. Tente informar uma conexão inexistente e veja qual será o retorno.

Abraços

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Mai 2017 18:17
por cjp
Entendo, meu caro. De qualquer forma agradeço a disposição em ajudar.

Testei com um número de conexão inexistente, retornou zero, assim como com conexão existente.

Não sei mais qual teste poderia fazer. Alguma sugestão?

O maior problema é que ela às vezes não está chamando a conexão, daí fica tentando executar uma query na conexão errada (a que já estava antes), e daí dá erro.

Reaproveitamento de conexão MySQL

MensagemEnviado: 03 Jun 2017 12:55
por cjp
É normal que duas conexões retornem o mesmo número?

Tenho notado que isso tem ocorrido frequentemente. E daí complica tudo, pois como vou saber qual é qual?

Existe algum jeito de evitar isso?

Reaproveitamento de conexão MySQL

MensagemEnviado: 13 Jun 2017 13:01
por NiltonGM
Eu uso HMG 3.4.4 e não preciso desses RDD's para acessar o MySQL, acesso direto pelo HBMySQL pelas classes TMySQLServer(). Tenho uma aplicação em Harbour que acessa 4 banco de dados MySQL para estatística, as conexões são apenas um ponteiro em seu aplicativo onde vc pode armazenar em uma variável, logo vc poderá ter n conexões, o que vocês não devem esquecer é que cada banco de dados como o MySQL tem um timeout para cada conexão, isso é regra nos provedores pois imagina uma conexão esquecida de ser fechada pelo aplicativo que ficará aberta eternamente?! Então faço o seguinte procedimento, abro uma conexão qdo preciso acessar o BD, executo uma ou várias QUERY's e depois fecho. Se por ventura entre uma Query e outra passar tempo demais e ocorrer o Timeout pelo servidor MySQL, reabro uma nova conexão, como? Qdo for executar uma Query sempre verifico se aquela conexão (nResultHandle ou nSocket) ainda está aberta, se tiver executo, se não, abro nova conexão ali mesmo na função da query. Também temos que verificar após uma Query se o servidor não retornou ocupado 'server has gone away'
As classes estão no manual anexo.

Abraços e qualquer dúvida estamos por aqui.

Reaproveitamento de conexão MySQL

MensagemEnviado: 13 Jun 2017 14:55
por cjp
Era tudo que eu queria!!!

Mas não uso HMG e não sei como usar. Tem que baixar algum DLL, ou algum fonte para usar HMG?

Vi o manual, está muito claro, e parece bem simples de usar.

Só preciso mesmo saber como compilar com HMG, por favor.

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Jun 2017 10:49
por Mário Isa
venho pedir a ajuda de quem já está utilizando o banco MySQL a mais tempo que eu

portanto ...
meu provedor não me deixa conectar mais de 12 conexões ao mesmo tempo ao banco q está na internet...
e para isso eu preciso ficar
conectando e desconectando para dar lugar a outros que irão se conectar só para uma consulta.

mas .... se eu conectar uma vez no banco e desconectar
e se fizer isso pela segunda vez o programa fica meio crazy ... e fecha ....

outra coisa q percebo é q depois de feito a conexão e desconexão pela segunda vez a função q verifica a net conectada volta falso (quando na verdade tem internet disponível)

então segue o código do meu teste
vez := 2
ctavez := 1
while ctavez <= vez
cConString1 :="MySQL=IPdoMEUbanco;UID=usuarioDObanco;pwd=SENHAdoBANCO;dtb=NOMEdoBANCO;PRT=3306"
sinn := SR_AddConnection( CONNECT_MYSQL, cConString1 )
if sinn <= 0
  return nil
end

SR_ENDCONNECTION(sinn)

netconectada := verificanet()

ctavez++
end


Ou seja, se eu ajustar a variavel VEZ para 2 .... na segunda vez a variavel netconectada fica .F.

segue a função verificanet()
*******************************
Function VerificaNet( cAddress )
*******************************
LOCAL aHosts
LOCAL cName
InetInit()
IF cAddress == NIL
cAddress := "www.google.com.br"
ENDIF
aHosts := InetGetHosts( cAddress )
IF aHosts == NIL .or. len(aHosts)=0
InetCleanup()
RETURN .f.
endif
InetCleanup()
RETURN .t.


Pergunta:

Será que, na hora de finalizar a conexão com a função:
 SR_ENDCONNECTION(sinn)


Eu não estaria esquecendo de finalizar alguma outra coisa ?
:%

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Jun 2017 13:52
por fladimir
Vc já tentou mudar o limite de conexões simultaneas setado no seu banco de dados remoto?

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Jun 2017 19:56
por Mário Isa
boa noite..
o limite de conexões é de apenas 12 simultâneas
prá mudar eles querem 399,00 / mês ....

e o sistema só vai conectar de quando em quando prá fazer umas verificações

então eu precisava que conectasse .... executasse querys ... e desconectasse. ....

se eu fizer com o Toledo falou:
Inácio, faz o que o JoséQuintas falou, faz a conexão apenas uma vez no início do programa (no PRG principal/inicial) e só desconecta quando for finalizar o programa. Ai quando for executar as querys, não precisa conectar novamente, apenas construa a query e execute ela.


dá certinho ... conectar no início e só desconectar quando for embora...

pelo que vejo vou ter que encerrar a aplicação e re-executá-la

tudo que tentei não deu jeito...

Tentei dar
Clear Memory + dbcloseall()
.... após a desconexão....
.... tentei ... REQUEST SR_MYSQL

aliás .... teria como fazer o contrário do REQUEST ??

REQUEST é quando eu estou requisitando .....
e se eu quiser dispensar essa chamada ? ou seja .... dar um clear nela ? dispensar a requisição e chamá-la de novo ?
tem jeito ?

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Jun 2017 20:01
por Mário Isa
Ainda outra coisa:
Existe algum comando que suspenda a conexão para retomá-la logo a seguir?

pois entendo que

SR_ADDCONNECTION está adicionando mais conexões ....
apessar que entendo tb que SR_ENDCONNECTION deveria finalizar a conexão e o sistema esquecer que ela existiu ..
mas parece q isso não tá funcionando...

....

Reaproveitamento de conexão MySQL

MensagemEnviado: 23 Jun 2017 22:43
por JoséQuintas
Vamos lá....

Tenho um banco MySQL na internet, não faço idéia do limite.

Uso o da internet para o webservice de CEP, utilizado pelo aplicativo.
Uso também pra atualizar tabelas nos clientes.

Tenho um banco MySQL no MEU SERVIDOR, acessado por todos os clientes.

Uso pra disparar e-mails de NFE. Fica um aplicativo rodando 24 horas.
Todos os XMLs de NFE estão nele, o aplicativo atualiza sempre.
Antigamente também era usado pelos clientes pra acessar PDF de documentos, PDF gerado pelo Unidanfe, direto pelo aplicativo.
Tenho IP dinâmico, e o servidor é acessado através do no-ip.org

E tenho o banco MySQL em CADA CLIENTE.

Depois que fiz isso, comecei a transferir os XMLs de meu servidor para cada cliente.
É usado pelo aplicativo pra muita coisa do cliente.

A intenção final é que não precise mais do meu servidor.
Por enquanto está servindo de backup dos XMLs, além de enviar e-mails.

Do lado do cliente, o aplicativo pode acessar os três servidores, depende da situação/rotina.
O servidor do cliente é acessado o tempo todo, durante todo aplicativo.
O meu servidor é acessado pra disparar e-mails apenas, pode ser várias vezes por dia.
O da internet, é via webservice, ou então eventualmente pra atualizar tabelas do aplicativo.

O servidor da internet existe há muitos anos.
O meu servidor tá asim há uns 8 ou 9 anos.
O servidor dos clientes, uns 2 anos ou 3 anos.

Uso ADO, conexão MySQL do cliente conectada o tempo todo, as demais conectar/desconectar.

O que acontece no Windows:

O limite de half-open connections é 8 (OITO), se não foi aumentado.
Isso se refere a conexões "meio-abertas", que não podem ser consideradas nem abertas nem fechadas.
Antes do Windows XP Service Pack 1 ou 2, o limite era 16 MILHÕES, depois virou 8 UNIDADES.

O Windows faz cache de conexões, pra agilizar a tarefa.
Quando você fecha a conexão, ela fica pendente por um tempo, e não é fechada instantâneo.
Se ficar abrindo e fechando conexões, haverá uma fila de espera, cada vez maior, por causa do limite de 8 conexões.
Pode chegar ao ponto de travar tudo: Windows, roteador e tudo mais.
Não é limite de conexões abertas, é limite de conexões "meio-abertas".
Conta nisso conexões em fase de fechamento e conexões em fase de abertura.

Tem os limites do Windows pra manter uma conexão aberta fora de uso, tem limites do Windows pra manter um terminal conectado fora de uso, e tem outros limites.

Também tem a internet brasileira, que pode ter uma breve caída, e trocar o endereço de IP, e caso seja conexão via internet lá se foi a conexão.

Se ficar o bicho pega, se correr o bicho come.....
Só resta manter conexão aberta, e contornar eventuais problemas, se acontecerem.

Lembrando que além das suas conexões, tem as várias conexões que Windows e aplicativos costumam fazer....
É leitor de email, navegador de internet, programas de banco podendo fiscalizar conexões, antivírus, etc.

Reaproveitamento de conexão MySQL

MensagemEnviado: 24 Jun 2017 10:06
por JoséQuintas
esqueci de mencionar:

Dá pra dar uma olhada no andamento das conexões, com o comando NETSTAT -A
Opcionalmente acrescentando um filtro, por exemplo pra conexões TCP, ou porta 3306.

netstat -a | find /i "TCP"
TCP 192.168.1.4:49377 msnbot-65-52-108-229:https ESTABLISHED
TCP 192.168.1.4:49447 msnbot-65-52-108-194:https ESTABLISHED
TCP 192.168.1.4:49481 91.190.219.39:12350 ESTABLISHED
TCP 192.168.1.4:49483 40.69.164.178:https ESTABLISHED
TCP 192.168.1.4:49493 cb-in-f109:imaps ESTABLISHED
TCP 192.168.1.4:49494 imap03-farm74:imap ESTABLISHED
TCP 192.168.1.4:49793 65.55.223.40:40026 ESTABLISHED
TCP 192.168.1.4:49941 65.55.252.167:https ESTABLISHED
TCP 192.168.1.4:50008 64.4.54.254:https TIME_WAIT
TCP 192.168.1.4:50009 64.4.54.254:https TIME_WAIT
TCP 192.168.1.4:51090 a23-4-244-23:https CLOSE_WAIT
TCP 192.168.1.4:51091 a23-38-153-121:https CLOSE_WAIT
TCP 192.168.1.4:51092 198.41.215.182:http CLOSE_WAIT
TCP 192.168.1.4:51095 a23-4-244-23:https CLOSE_WAIT
TCP 192.168.1.4:51096 a23-4-244-23:https CLOSE_WAIT
TCP 192.168.1.4:51098 a23-38-153-121:https CLOSE_WAIT
TCP 192.168.1.4:51101 a23-4-244-23:https CLOSE_WAIT
TCP [fe80::f8ca:dfc3:cb10:6b80%12]:50010 serverjpa:3306 TIME_WAIT
TCP [fe80::f8ca:dfc3:cb10:6b80%12]:50011 serverjpa:3306 ESTABLISHED
TCP [fe80::f8ca:dfc3:cb10:6b80%12]:50012 serverjpa:3306 TIME_WAIT
TCP [fe80::f8ca:dfc3:cb10:6b80%12]:50013 serverjpa:3306 ESTABLISHED


As quatro últimas são do MySQL, porta 3306.

Reaproveitamento de conexão MySQL

MensagemEnviado: 24 Jun 2017 10:13
por JoséQuintas
Durante e depois do aplicativo.
Usei um intervalo de tempo entre os comandos. Deve ter levado mais de um minuto até as conexões desaparecerem de vez.

mysql.png

Reaproveitamento de conexão MySQL

MensagemEnviado: 24 Jun 2017 10:21
por JoséQuintas
Aproveitei pra olhar o comportamento em multithread.
São várias janelas usando a mesma conexão MySQL.
Só não sei porque aparecem duas conexões ao invés de uma, talvez seja o teste do ODBC que faço no início do aplicativo.
Lembrando que uso ADO, não sei se o comportamento de hbmysql é igual.

mysql2.png


E importante:
Se eu usasse abrir/fechar conexões, uma janela acabaria com o funcionamento da outra, porque fecharia a conexão.
A não ser que usasse conexões diferentes, mas nessa mesma tela eu teria 7 conexões abertas, ao invés de uma só.
Isso considerando cada módulo, porque se fosse em cada rotina.... vixe....

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 00:58
por JoséQuintas
meu provedor não me deixa conectar mais de 12 conexões ao mesmo tempo ao banco q está na internet...


Só atualizando a informação, agora sei o meu limite.

kinghost.png


Mas meu plano é de revenda, não faço a menor idéia se isso altera alguma coisa, ou se esse limite é total dos domínios.

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 12:57
por Mário Isa
quanto pagas por mês ?

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 16:17
por JoséQuintas
Essa é a questão: Meu plano não existe mais.
Fiz o REVENDA I, agora só existe REVENDA III.
Com esse plano eu me transformei numa revenda de hospedagem.
Uma revenda que não revende.... rs

A parte legal do plano:
Eu faço tudo sozinho.
Ontem, em 50 minutos, contados a partir do pedido de registro, o domínio estava pronto.
Esse banco MySQL já foi no domínio novo.

dominio.png


Vai ter que confirmar como funciona nos planos existentes da kinghost, porque não faço idéia.
Com o plano revenda, crio domínios à vontade.
Infelizmente, isso não significa que tenho espaço à vontade, é até menos que um plano comum, de um usuário comum.
Apenas posso compartilhar o espaço entre todos os domínios "clientes".

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 17:03
por JoséQuintas
Continuando:

Pra MySQL sem limite, complemento com meu servidor aqui.
Pra e-mails antigamente tinha o google apps grátis pro domínio inteiro, mas atualmente uso o gmail, que me dá 5GB de espaço e puxo os e-mails do domínio.
É questão de avaliar como complementar.

Considere o seguinte:
Se contratar uma hospedagem com bastante espaço, que custe 300 reais por mês, vai custar 3.600 por ano.
Se comprar uma máquina para MySQL e mais nobreak, pode custar menos que isso.
E pode usar seu servidor pra serviços adicionais, e o nobreak pra sua máquina também.

Como criei meu primeiro servidor MySQL:
Ia jogar uma máquina no lixo, e antes de jogar no lixo, coloquei MySQL pra rodar pra fazer teste.
Ficou rodando por 2 anos ou mais, até colocar uma nova.... rs

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 17:20
por Mário Isa
será q dá prá eu pegar uma máquina e deixá-la, como servidora de um banco mySql e meus clientes podem se conectar a este banco ? até pq eu já tenho uma máquina q fica 24 hs....

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 17:21
por fladimir
tenho 2 dominios 1 hospedado no KingHost plano básico 356,00 anual com limite de 100 conexões simultaneas tb no banco de dados
tenho 1 + barato no Hostgator, 238,80 anual porém 25 conexões simultaneas.

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 17:26
por fladimir
Mário
será q dá prá eu pegar uma máquina e deixá-la, como servidora de um banco mySql e meus clientes podem se conectar a este banco ? até pq eu já tenho uma máquina q fica 24 hs....


Sim pode, é relativamente fácil fazer isso, porém mesmo q fique 24h ligada não terá a mesma estabilidade, explico, tenho algo semelhante mas servidor de FTP, onde são feitos os backups etc, 24h ligada conexão relativamente boa 5MB UP 50MB Download, com nobreak autonomia média 30 min, mesmo assim eventualmente temos oscilações, ou da operadora telefônica, ou da rede elétrica, isso faz com q a estabilidade logicamente não seja a mesma de uma hospedagem, mas dependendo a necessidade resolve bem.

No teu caso não sei exatamente, se for pra armazenar o BD da aplicação do cliente, se a maioria dos usuários do teu sistema for em horário comercial, acho q pode até dar certo, mas seria bom pensar algo a nível de replicação, ou seja, um BD local replicando na nuvem, com isto se estiver OFF line o BD remoto, vai trabalhando localmente, a hora q voltar replica pra Nuvem e assim por diante, como disse depende muito da finalidade x necessidade.

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 18:37
por Mário Isa
obrigado pelas valiosas dicas ....

na verdade esse BD mysql q tenho é de um site que roda em ASP.

Ele está hospedado no hoteldaweb.com.br mas lá estou tendo esse inconveniente ..... poucas conexões simultâneas ao banco ....

os meus bancos ainda sao .dbf (localmente) mas o programa conecta-se ao mysql só para fazer verificações ... exemplo: a cada 5 minutos ele vem e vê ... teve alguma venda ? se sim é preciso baixar para o banco local .... depois ele vê ... teve alguma alteração no estoque local ? então precisa alterar no mysql ...

então ... prá mudar de servidor acho meio ruim pois já mudei de servidor inúmeras vezes ... do hotel prá locaweb.... depois pro GODADDY ... depois pro kinghost e finalmente de volta ao hoteldaweb ... esse último porque o ftp deles é melhor ... permite criar sub-pastas ... me dá mais conexões simultâneas ao ftp ......

então estou pensando em colocar o site prá rodar num servidor meu pois aí não terei esses problemas de limitações .... mas ... prá colocar o .asp prá rodar numa máquina minha (servidora) é fácil ? o q eu teria q instalar ?

já tem algum pacote pronto prá isso ?

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 20:44
por JoséQuintas
já tem algum pacote pronto prá isso ?


Tem, chama-se MySQL.

na verdade esse BD mysql q tenho é de um site que roda em ASP.


o programa conecta-se ao mysql só para fazer verificações ... exemplo: a cada 5 minutos ele vem e vê


E quem disse que precisa acessar o MySQL diretamente?
Geralmente esse limite é pra acesso externo.
Se programa em ASP....

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 20:49
por JoséQuintas
Meu webservice de CEP consulta o banco MySQL, consulta os correios on-line,, salva no MySql....

Tudo isso é feito assim:

http://www.jpatecnologia.com.br/cep.asp?cep=03676-080


E nem conheço ASP direito... só o básico.... rs

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 20:58
por JoséQuintas
esse último porque o ftp deles é melhor ... permite criar sub-pastas ... me dá mais conexões simultâneas ao ftp ......


Esquisito precisar tanto disso.
Mas o kinghost também permite subpastas, isso não seria diferencial.

Reaproveitamento de conexão MySQL

MensagemEnviado: 25 Jun 2017 22:43
por Mário Isa
tive uma idéia... eu posso transportar o banco de lá do hotel prá um servidor meu ... o site continuaria rodando lá no hotel.... vou tentar isso..... acho q vai dar certo.