Clipper On Line • Ver Tópico - ADO / SQLMIX / ADOXB

ADO / SQLMIX / ADOXB

Discussão sobre SQL

Moderador: Moderadores

 

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 09 Mar 2015 11:49

A propósito...
Tenho no aplicativo um arquivo de LOG, que registra tudo que for feito pelo usuário.
Então esse arquivo é usado em todo o aplicativo, em tudo que é lugar.
O registro é feito por uma única função: GravaOcorrencia()
Ontem importei o DBF no MySql, e alterei essa função pra salvar no MySql.
Fiz isso pra duas empresas aonde tenho acesso total, e deixei instalado o novo programa.

Hoje está rodando normalmente.
Não existe mais o log em DBF, somente em MySql, usando ADO.

Nota:
Eu já usava ADO pra salvar NFE no meu servidor, então todos os terminais já tinham o odbc mysql instalado.
Não mexi nessa parte, já que funciona assim há anos.
Então a partir de hoje o aplicativo está usando DBFs no servidor local, MySql no servidor local, e MySql no meu servidor (remoto para o aplicativo).
É o mesmo EXE/aplicativo pra todos os clientes. Nos demais continua usando DBF pra isso.

Agora é questão de tempo para o aplicativo inteiro, e outros clientes, usarem MySql.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 09 Mar 2015 12:25

Até que é um começo bom.
Começou com mais de meio milhão de registros.
Anexos
jpreguso.png
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor fladimir » 14 Mar 2015 15:51

Poderia explicar Alexandre?

2 - deve haver índice para todos os campos referenciados nas cláusulas WHERE de suas consultas, se eles não forem a chave primária.


Se no Where eu tiver 10 campos terei q ter 10 indices? como assim? tenho q criar antes? não entendi direito.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


DESKTOP CONSOLE Harbour | MinGW | DBF | CDX | FastReport | MySQL
DESKTOP VISUAL... Harbour | MinGW | Xailer | MariaDB Nativo | FastReport
MOBILE Android/IOS e WEB - Windev Mobile 22
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2306
Data de registro: 15 Nov 2006 19:21
Curtiu: 24 vezes
Mens.Curtidas: 128 vezes

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 15 Mar 2015 17:27

Sei que não fui eu que falei isso, mas vamos eliminar essa pendência.
Nesse meu arquivo de log, esqueci de criar índice no meu banco de dados de teste.
A navegação nos pedidos estava demorando quase 2 segundos pra pular de um pedido para o outro, por causa de consultar as ocorrências nesse arquivo de log. (2 segundos, mais de meio milhão de registros sem índice)
Minha pesquisa é pelo arquivo e código.
Então criei um índice igual à pesquisa: arquivo, código, idregistro
O índice é no estilo que estamos acostumados, uma chave que facilite a pesquisa.

SELEcT * FROM JPREGUSO WHERE ARQUIVO='pedidos' AND CODIGO='numpedido'


Essa pesquisa acima. reduziu de quase 2 segundos pra instantânea.
Mesmo assim, 2 segundos para mais de meio milhão de registros, é impossível essa velocidade usando dbf em rede sem índice.
Só pra efeito de comparação.

Lógico: não precisei mexer nos fontes. Foi só acrescentar o índice no servidor pra ter mais velocidade.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 15 Mar 2015 17:52

Uma das opções disponíveis pra mexer no servidor é o HeidiSql.
Acesso minha base MySql que roda em servidor Windows, e também a base MySql que roda no cliente em Linux.

Pelo programa dá pra fazer backup, restaurar, criar estruturas, bancos de dados, fazer consultas, alterações, etc.

Uma parte interessante é ele mostrar no painel de baixo todos os comandos que ele usa.
Então pode aprender com ele.

Por exemplo, criou índice, olha no painel pra ver como ele criou, para o caso de querer fazer um programa pra isso.

Também pode ser usado pra testar comandos. É só digitar e ele executa, inclusive de consultas.

Uma opção interessante que descobri há pouco tempo é copiar direto de um servidor para o outro.

Na foto, o arquivo e índice que mencionei.
Anexos
heidisql.png
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor fladimir » 15 Mar 2015 18:04

Entendi José, obrigado.

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


DESKTOP CONSOLE Harbour | MinGW | DBF | CDX | FastReport | MySQL
DESKTOP VISUAL... Harbour | MinGW | Xailer | MariaDB Nativo | FastReport
MOBILE Android/IOS e WEB - Windev Mobile 22
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2306
Data de registro: 15 Nov 2006 19:21
Curtiu: 24 vezes
Mens.Curtidas: 128 vezes

u

Mensagempor JoséQuintas » 15 Mar 2015 22:42

Pra facilitar trabalhar com o retorno de consulta, fazer um tbrowse por exemplo, criei uma pequena rotina pra converter pra dbf.
Mas forneço previamente a estrutura, pra retornar do jeito certo.
Apesar de usar algumas funções próprias, dá pra entender do que se trata, algumas até já foram comentadas por aqui.

METHOD SQLToDBF() CLASS ADOClass
   LOCAL nSelect, cDbfFile, nCont
   nSelect := Select()
   cDbfFile := MyTempFile( "dbf" )
   SELECT 0
   dbCreate( cDbfFile, ::oStructure )
   USE ( cDbfFile ) ALIAS SqlToDbf
   DO WHILE .NOT. ::Rs:Eof()
      RecAppend()
      FOR nCont = 1 TO Len( ::oStructure )
         DO CASE
         CASE ::oStructure[ nCont, 2 ] == "N"
            FieldPut( nCont, ::NumberSql( ::oStructure[ nCont, 1 ] ) )
         CASE ::oStructure[ nCont, 2 ] == "D"
            FieldPut( nCont, ::DateSql( ::oStructure[ nCont, 1 ] ) )
         OTHERWISE
            FieldPut( nCont, ::StringSql( ::oStructure[ nCont, 1 ] ) )
         ENDCASE
      NEXT
      ::Rs:MoveNext()
   ENDDO
   ::Rs:Close()
   USE
   SELECT ( nSelect )
   RETURN cDbfFile


Neste ponto, dependendo de como funcionar, SQLMIX poderia ser interessante.

Mas depende de como isso é feito.
No meu uso prático, várias conexões são problema, principalmente se ficar abrindo/fechando conexões.
Infelizmente no Windows isso sobrecarrega conexões, mesmo abrindo/fechando toda hora, porque o Windows deixa em estado de espera, e isso conta como half-open connection, onde o limite do Windows é de apenas umas 10 conexões nesse estado. (Até o Windows 2000 o limite era mais de 67 milhões de conexões).

Então SQLMIX no Windows depende:
1. De não abrir conexão pra cada comando USE
2. De funcionar do jeito que esperamos
3. De como essa conversão é feita, já que é baseada na estrutura do MySql

Na dúvida, a rotina acima fez o serviço, e vai entrar em prática amanhã.

Explicando melhor:
Basta uma conexão com o banco de dados e nada mais, mas se usar uma conexão pra cada operação também funciona.
No Windows dá pra abrir conexões ilimitadas, sem problema.
O problema é nas conexões abrindo e fechando: o Windows tem limite baixo (10) pra conexões nessa situação.
E o Windows não fecha instantâneo, deixa em espera por um determinado tempo.
Quando excede esse limite, as conexões vão ficando em fila, até que pode congelar tudo se tiver conexão demais em half-open.
O nome diz tudo half-open = meio aberta, nem aberta e nem fechada.
Aliás, não sei se é exclusivo do Windows, porque até meu roteador chegou a ficar lento aqui quando eu usava abrir/fechar toda hora, e rodando o programa direto no servidor (não pra acesso externo).

Por isso é bom entender como funciona, porque na prática tem dessas coisas.
Como imaginar que a sobrecarga de conexões é por causa de conexões fechadas?

Quem usa Torrent e Emule já deve ter visto sobre isso, mas talvez não tenha associado a conexões abrindo/fechando, e imaginou que o problema era relacionado a total de conexões.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor Itamar M. Lins Jr. » 15 Mar 2015 23:59

Com SQLMIX vc não precisa dessa função SQLToDBF.
Já vem tudo em DBF.

#require "rddsql"
#require "sddmy"

#include "dbinfo.ch"
#include "error.ch"

REQUEST SDDMY
REQUEST SQLMIX

ANNOUNCE RDDSYS

FIELD RESIDENTS

PROCEDURE Main()

#if defined( __HBSCRIPT__HBSHELL )
   rddRegister( "SQLBASE" )
   rddRegister( "SQLMIX" )
   hb_SDDMY_Register()
#endif

   rddSetDefault( "SQLMIX" )

   ? "RDDs:"; AEval( rddList(), {| x | QQOut( "", x ) } )

   IF rddInfo( RDDI_CONNECT, { "MYSQL", "localhost", "test", , "test" } ) == 0
      ? "Unable connect to the server"
      RETURN
   ENDIF

   CreateTable()

   ? "Let's browse table (press any key)"
   Inkey( 0 )
   dbUseArea( .T., , "SELECT * FROM country", "country" )
   Browse()

   ? "Let's browse table ordered by resident count (press any key)"
   Inkey( 0 )
   INDEX ON field->RESIDENTS TAG residents TO country
   Browse()

   dbCloseAll()

   RETURN

STATIC PROCEDURE CreateTable()

   ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" )
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11))" )
   ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600), ('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" )

   RETURN


Como eu disse só sei até ai, porque uso muito pouco.
SQLMIX é SQL e xBASE só isso, e os recursos do Harbour, criar índices com o resultado direto na memoria RAM por exemplo.

Use o SQLMIX ai, faça o teste e mostre seus resultados se presta ou não. Aqui eu usei com MSSQL, Firebird, MDB(Access) mas apenas para importar dados p/ meu aplicativo.
Para mim é muito útil.
No meu uso prático, várias conexões são problema, principalmente se ficar abrindo/fechando conexões.
...


Quanto a essas coisas do ADO/Windows não sei, acredito que usando PHP/Java/etc é a mesma coisa com SQLMIX não tenha essas limitações do ADO. Estou me referindo a Conexões abertas/tempo etc... se é do ADO/Windows ou é do MySQL ?
Teria que testar em um servidor Linux/MySQL ou MariaDB para ver se vc terá esse mesmo problema, acredito que não.
É uma coisa rápida montar esse servidor com isso, basta ter um CPU velho por ai.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3459
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 102 vezes
Mens.Curtidas: 165 vezes

ADO / SQLMIX / ADOXB

Mensagempor alxsts » 16 Mar 2015 00:12

Olá!

JoséQuintas escreveu:Sei que não fui eu que falei isso, mas vamos eliminar essa pendência.

Obrigado Quintas. Ainda não consegui escrever isto pois queria detalhar mais. Mas, o teu exemplo prático foi muito bom. Eu quero explicar porque funciona assim... @Fladimir: ainda estou devendo a resposta.

Quanto à rotina acima, que converte um record set para DBF para depois exibir em um tBrowse, é desnecessária, para este objetivo. É possível fazer tBrowse no próprio record set. O código abaixo foi retirado de uma aplicação minha. Talvez dê erro ao ser compilado pois retirei muitas linhas, deixando apenas o que interessa como exemplo:
#include "box.ch"
#include "ado.ch"
#include "set.ch"
#include "hbcompat.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "tbrowse.ch"

// Default column separator
#define DEF_CSEP  " " + chr(179) + " "

// Default heading separator
#define DEF_HSEP chr(196) + chr(194) + chr(196)

// Default footing separator
#define DEF_FSEP chr(196) + chr(193) + chr(196)

STATIC oCn As Object

//------------------------------------------------------------------------------

INIT PROCEDURE AppInit()

   LOCAL oErr As Object
   LOCAL cCnString As Character
   LOCAL nDataType As Numeric

   RELEASE GetList
   SET EventMask TO INKEY_ALL

   REQUEST HB_CODEPAGE_PTISO
   HB_CDPSELECT("PTISO")

   SetColor( "N/W, RB/W*" )
   Set( _SET_DATEFORMAT, "dd/mm/yyyy" )
   //SetMode(50,150)
   SetMode(70,197)
   SetBlink( .F. )
   MSetCursor(.T.)
   //SetColor( "W+/N, N+/W" )

   CLS

   DispBox( 0,0,2, MaxCol(), Space(9), "W+/RB"  )
   DispBox( 3,0,MaxRow() - 1, MaxCol() * .25, Space(9), "N/N"  )
   DispBox( 3,(MaxCol() * .25) + 1,MaxRow(), MaxCol() , Space(9), "N/BG+"  )
   DispBox( MaxRow(), 0, MaxRow(), MaxCol(), Space(9), "N/W"  )
   DispOutAt( 1,0, PadC("Testando Harbour + ADO + SQL Server",MaxCol()), "W+/RB" )

   Try
      cCnString := "Provider=SQLNCLI10;Server=999.99.99.9;Database=MyDB;Uid=MyUID;Pwd=MyPwd;"

      oCn := win_OleCreateObject("ADODB.Connection")

      oCn:ConnectionString := cCnString
      oCn:CursorLocation := adUseClient
      oCn:Mode := adModeReadWrite

   Catch oErr
      HB_Alert( { "Não foi possível conectar ao banco de dados.;Erro:  : " + oErr:Description, "", "Operação: " + oErr:Operation },{ ' Fechar ' },"W+/B", 15 )
      __Quit()
   Finally

   End

RETURN

//------------------------------------------------------------------------------

FUNCTION Main()

   LOCAL oTbr, oRs, oColumn As Object
   LOCAL i, nKey, nLen, nOldCursor As Numeric
   LOCAL cSql As Character
   LOCAL oErr As Object
   LOCAL oCmd As Object
   LOCAL lVar As Logical := .F.
   LOCAL nRecno As Numeric
   LOCAL nBtn As Numeric
   LOCAL dummy   := NIL
   LOCAL GetList As Array := {}

Altd()

   Try
      TEXT INTO cSql
         SELECT *
           FROM dbo.tbCountry
       ORDER BY 1
      ENDTEXT

      oRs := ExecuteSql( cSql )

      IF oRs != NIL
         oTbr := TBrowseDB():new( 04, 3, MaxRow() - 7, MaxCol() - 3 )

         // Separators
         oTbr:headSep   := DEF_HSEP
         oTbr:colSep    := DEF_CSEP
         oTbr:footSep   := DEF_FSEP
         oTbr:cargo     := oRs:bookMark

         // Navigation code blocks for Record Set
         oTbr:goTopBlock    := { || oRs:moveFirst() }
         oTbr:goBottomBlock := { || oRs:moveLast() }
         oTbr:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }

         // Colors
         //oTbr:colorSpec := "N/W, BG/W*,W+/BG"
         oTbr:colorSpec := "N/W, W+/BG,N/W*"
         
         // create TBColumn objects and add them to TBrowse object - zero based
         nLen := oRs:fields():count() - 1
         FOR i := 0 TO nLen
            // add code block for individual columns of the record set
            oColumn := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
            // Column widths. For some data types, definedSize returns -1...
            oColumn:width := Max( Min( oRs:Fields(i):definedSize,50), Len( oRs:fields(i):name ) )

            /// TODO: set Column pictures

            // Add new column to TBrowse
            oTbr:addColumn( oColumn )
         NEXT

         DispBox( oTbr:nBottom, oTbr:nLeft - 1, oTbr:nBottom + 4, oTbr:nRight + 1, B_SINGLE + " " )
         DispBox( oTbr:nTop - 1, oTbr:nLeft - 1, oTbr:nBottom, oTbr:nRight + 1, B_SINGLE )

         nOldCursor := SetCursor( SC_NONE )

         DO WHILE .T.

            DispBegin()

            oTbr:forceStable()

            // Paint TBrowse current line...
            oTbr:ColorRect( { oTbr:RowPos, oTbr:LeftVisible, oTbr:RowPos, oTbr:RightVisible }, { 2, 1 } )
            // ... and current cell in different colors
            oTbr:ColorRect( { oTbr:rowPos, oTbr:colPos, oTbr:rowPos, oTbr:colPos }, { 3, 2 } )

            oTbr:refreshCurrent()
           
            DispEnd()
           
            IF ( oRs:eof() )
               DispOutAt( Int( ( oTbr:nBottom - oTbr:nTop ) / 2 ), oTbr:nLeft + 2, ;
                    PadC( "Não há dados disponíveis para exibição.", Int( oTbr:nRight - oTbr:nLeft ) - 2 ), "W+/RB" )
            ELSE
               DispOutAt( MaxRow(), 1, PadR( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ), "N/W" )
            ENDIF

            nKey := Inkey(0)

            IF oTbr:applyKey( nKey ) == TBR_EXIT
               EXIT
            ELSEIF nKey == K_ENTER
               nRecno := oRs:bookMark
               EditInsert( oRs:getRows( 1, adBookmarkCurrent ) )
               oRs:bookMark := nRecno
            ELSEIF nKey == K_INS
               // Rotina de inclusão
            ELSEIF nKey == K_DEL
               // Rotina de exclusão
            ENDIF

         ENDDO

      ENDIF
   Catch oErr
      HB_Alert( { "Ocorreu o erro : " + oErr:Description, "", "Operação: " + oErr:Operation },{ 'Abort', 'Retry', 'Skip' },"W+/B", 15 )

   Finally
      IF oRs != NIL .And. oRs:state() = adStateOpen
         oRs:close()
      ENDIF

      IF oCn != NIL .And. oCn:state() = adStateOpen
         oCn:close()
      ENDIF

      oCn := NIL
      oRs := NIL
      SetCursor( nOldCursor )
      CLS
   End

RETURN NIL

//------------------------------------------------------------------------------

STATIC FUNCTION ExecuteSql( cSql )

   LOCAL oRs As Object
   LOCAL oErr As Object

   Try
      oRs := win_OleCreateObject("ADODB.RecordSet")

      With Object oRs
         :activeConnection := oCn:connectionString

         :cursorLocation := adUseClient
         :cursorType := adOpenDynamic

         :lockType := adLockOptimistic

         //:maxRecords := 100000
         :cacheSize := 100
         :source := cSql

         :open()
      End With

      If ! oRs:eof()
         oRs:moveFirst()
      Endif
     
   Catch oErr
      Throw( oErr )
   Finally
      IF oRs:state() = adStateOpen
         oRs:close()
      ENDIF
   End

   RETURN oRs

//------------------------------------------------------------------------------
STATIC FUNCTION  ADORecordSetSkipper(oRecordSet,nSkip)

   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )
     
      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)

//------------------------------------------------------------------------------

// This code block uses detached LOCAL variables to
// access single elements of a two-dimensional array.
FUNCTION ADORecordSetFieldBlock( oRs, i )
RETURN { || If( oRs:eof(),Space(Max(oRs:Fields(i):DefinedSize,Len(oRs:Fields(i):name))), oRs:fields(i):Value() ) }

//------------------------------------------------------------------------------
STATIC FUNCTION EditInsert( aRecord )

RETURN NIL
//---------------------------------------------------------------------------------


No caso de se desejar transferir o conteúdo de um record set para um array, é só utilizar o método getRows:
LOCAL aRecords

   aRecords := oRs:getRows()
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2176
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 145 vezes

ADO / SQLMIX / ADOXB

Mensagempor Itamar M. Lins Jr. » 16 Mar 2015 00:36

MySQL no Linux eu iria estudar apenas isso aqui.

http://www.douglaspasqua.com/2011/04/22/tuning-no-mysql/
http://www.vivaolinux.com.br/_etc/my.cnf-fabio/
//tirar esse underline do etc

Por isso o pessoal não curte muito usar Windows + ADO como servidor com MySQL
Tem muita otimização extra p/ fazer no windows e nesse tal ADO.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3459
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 102 vezes
Mens.Curtidas: 165 vezes

ADO / SQLMIX / ADOXB

Mensagempor fladimir » 16 Mar 2015 00:57

Vlw Galera...
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


DESKTOP CONSOLE Harbour | MinGW | DBF | CDX | FastReport | MySQL
DESKTOP VISUAL... Harbour | MinGW | Xailer | MariaDB Nativo | FastReport
MOBILE Android/IOS e WEB - Windev Mobile 22
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2306
Data de registro: 15 Nov 2006 19:21
Curtiu: 24 vezes
Mens.Curtidas: 128 vezes

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 16 Mar 2015 04:12

Por isso o pessoal não curte muito usar Windows + ADO como servidor com MySQL
Tem muita otimização extra p/ fazer no windows e nesse tal ADO.


O texto me deu a impressão de que consideraram ADO como parte do servidor.
Não entendi o que quiseram dizer sobre otimização extra.

No servidor é só instalar o MySql, nem precisa configuração adicional.

No terminal é instalar o ODBC MySql.
Tanto faz se o servidor vai ser Windows ou Linux.
No final é como se fosse a SQLMIX, um intermediário entre o programa e o ODBC.
Só que ao invés de retornar em formato DBF, retorna no formato dele (o tal recordset).

O problema, como falei antes, é se o conector abrir uma conexão para cada uso.
Isso exigiria configurações extras.
Mas se uma única conexão resolve tudo, é só usar uma única conexão.

Pra acompanhar as conexões do MySql, só usar:
netstat -a | find "3306"

Vai mostrar todas as conexões usando a porta 3306, que é a porta padrão do MySql.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor JoséQuintas » 16 Mar 2015 04:18

Alexandre.
Valeu, vou testar.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10495
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 670 vezes

ADO / SQLMIX / ADOXB

Mensagempor Itamar M. Lins Jr. » 16 Mar 2015 10:50

Otimizações do ADO e do Windows.
 oConexao:CursorLocation    := adUseClient // cliente
oConexao:CommandTimeOut   := 60 // seconds
oConexao:ConnectionTimeOut  := 60 // seconds
oConexao:options...
oConexao:Locktype...
...

No Windows a velocidade e quantidade de conexões por causa do ADO.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3459
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 102 vezes
Mens.Curtidas: 165 vezes

ADO / SQLMIX / ADOXB

Mensagempor Itamar M. Lins Jr. » 16 Mar 2015 11:00

Por exemplo:
table_cache é o número de tabelas abertas em cache para todos threads. Aumentar esse valor aumenta o número de file descriptors que o MySQL irá precisar abrir para trabalhar. Esse parâmetro esta relacionado com o max_connections: Caso tenha o valor de 200 para max_connections, você deve setar table_cache para 200 * N, onde N é o número máximo de tabelas usada por join em qualquer das queries que você estiver usando na sua aplicação. Aumentar muito o valor desse parâmetro pode fazer com que o MySQL exceda o número máximo de file descriptors abertos por processo. Este é um limite definido pelo S.O. Tenha certeza que o seu S.O. permita abrir o número de file descritptors definido em table_cache. No Linux, para checar o número máximo de file descriptors permitidos use o comando abaixo:

...
thread_cache_size:

Quantidade de threads que o servidor irá cachear para re-utilização. Quando um cliente desconecta a thread irá para um cache podendo dessa forma ser reutilizada. Dessa maneira diminuimos a criação de novas threads para atender novos clientes. Esse parâmetro pode ser aumentado para melhorar a performance caso seu servidor tenha muitas conexões por segundo. Através de um cálculo utilizando o número de conexões criadas e o número de threads novas criadas é possível determinar a eficiência desse cache, e então determinar um valor mais apropriado para esse parâmetro. A taxa de acerto baseado no cálculo abaixo deve estar o mais próximo possível de 99%:

100 - ((Threads_created / Connections) * 100)

Threads_created é o número de thread criadas desde que o MySQL foi iniciado. Connections é o número total de conexões criadas desde que o servidor do MySQL foi iniciado. Nossa intenção é que o número de threads criadas seja o menor possível em relação ao número total de conexões realizadas.

Para obter o número de threads criadas, execute o comando abaixo no console do mysql:

mysql> SHOW STATUS LIKE '%thread%';


Ao invés de ficar mexendo em dois lugares (ADO+Windows) otimizar apenas o MySQL.

Uma vez que no Linux não tem algumas limitações do Windows: COISAS que é preciso mexer(otimizar) na base do "REGEDIT"

Saudações,
Itamar M. Lins Jr
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3459
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 102 vezes
Mens.Curtidas: 165 vezes

Anterior Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro