none
Socorro, travamento Web Service RRS feed

  • Pergunta

  • Olá pessoal!

    Estou com um problema num Web Service que é consumido por Pocket PC.

    Se alguém tiver disponibilidade para ler sobre meu problema, manifeste-se por gentileza, assim contarei minha história.

     

    Grato,

     

    Leonardo Freitag

    segunda-feira, 13 de setembro de 2010 18:35

Respostas

  • Olá André!

     

    Consegui solucionar o problema.

    Baixei a versão mais atual do Firebird .Net Provider e instalei no servidor.

    Na connection string alterei as seguintes configurações:

     

            cs.MaxPoolSize = 100;
            cs.Pooling = false;

    Já consegui realizar 450 lançamentos sem problema algum, agora vou para o cliente.

    Abraço e obrigado.

     

    Leonardo Freitag

    segunda-feira, 20 de setembro de 2010 23:18

Todas as Respostas

  • Olá pessoal!

    Estou com um problema, já pesquisei bastante e não consigo resolver.
    Desenvolvi um Web Service para ser consumido por um software que roda em Pocket PC com Windows Mobile. Esse Web Service utiliza a Firebird ADO.NET Data Provider para acessar um banco de dados de um determinado sistema que possuo.
    Segue exemplo de um WebMetod:

        [WebMethod] // método que retorna dados do produto
        public Produtos LerProduto(string produtoCodigo)    
        {
            Produtos meuProduto = new Produtos();

            string connectionString;
            cnDados stringConexao = new cnDados();
            connectionString = stringConexao.GetConexao();


            // abertura da conexão e início da transação
            FbConnection connection = new FbConnection(connectionString);
            connection.Open();
            FbTransaction transaction = connection.BeginTransaction();

            // exeução do comando no banco de dados
            string selectQuery = "SELECT COD_ESTOQUE, NOME, PRECO_VENDA, GRUPO FROM ESTOQUE WHERE COD_ESTOQUE = @ICOD_ESTOQUE";
            FbCommand command = new FbCommand(selectQuery, connection, transaction);
            command.Parameters.Add("@ICOD_ESTOQUE", produtoCodigo);
            FbDataReader leitor = command.ExecuteReader();

            try
            {
                if (leitor.Read())
                {
                    meuProduto.ProdCodigo = leitor.GetString(0);
                    meuProduto.ProdDescricao = leitor.GetString(1);
                    meuProduto.ProdPreco = leitor.GetFloat(2);
                    meuProduto.ProdGrupo = leitor.GetString(3);
                }
                else
                {
                    meuProduto.ProdCodigo = "";
                    meuProduto.ProdDescricao = "";
                    meuProduto.ProdPreco = 0;
                    meuProduto.ProdGrupo = "";
                }
                return meuProduto;
            }
            catch (Exception e)
            {
                throw new Exception();
            }
            finally
            {
                transaction.Commit();
                leitor.Close();
                connection.Close();
            }

    Segue exemplo de GetConexao();
        public string GetConexao()
        {
            appIp = ConfigurationManager.AppSettings.Get("Key0");
            appCaminho = ConfigurationManager.AppSettings.Get("Key1");
            appUser = ConfigurationManager.AppSettings.Get("Key2");
            appSenha = ConfigurationManager.AppSettings.Get("Key3");
            //appDialect = ConfigurationManager.AppSettings.Get("Key4");

            FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
            cs.DataSource = appIp;
            cs.Database = appCaminho;
            cs.UserID = appUser;
            cs.Password = appSenha;
            cs.Dialect = appDialect;
            cs.ConnectionLifeTime = 1;
            cs.ConnectionTimeout = 15;
            cs.MaxPoolSize = 200;

            appConexao = cs.ToString();

            return appConexao;
        }

    Tudo funcionava bem, porém deparei-me com uma situação em que acontece um travamento e me é apresentada uma mensagem no Pocket que finalizava com:

    Server was unable to process request.
    ---> Timeout exceeded.


    Tentei utilizar esse mesmo WebMethod para ler produtos no banco de dados utilizando o Firefox (navegador), e depois de exatos 15 segundos obtive a seguinte resposta:

    System.SystemException: Timeout exceeded.
      at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckMaxPoolSize()
      at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut()
      at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
      at Service.LerProduto(String produtoCodigo)

    Resolvi então compartilhar meu problema na lista e pedir encarecidamente a atenção  e ajuda dos companheiros.

    Leonardo Freitag.
    sexta-feira, 17 de setembro de 2010 12:42
  • Boa tarde,

    Seu problema provavelmente esteja na sua string de conexão,

     

    O erro aparentemente está no usso de Pool de Conexões, onde você não está fechando suas conexões como deveria...

     

    Então para teste, por favor, poste a string de conexão ou desative o pool

     

    att

    Evandro

     

     


    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    sexta-feira, 17 de setembro de 2010 17:13
  • Para testes, mude um pouco esse seu código, e coloque esse:

     

          Produtos meuProduto = new Produtos();
    
          string connectionString;
          cnDados stringConexao = new cnDados();
          connectionString = stringConexao.GetConexao();
    
    
          // abertura da conexão e início da transação
          using (FbConnection connection = new FbConnection(connectionString))
          {
            connection.Open();
            FbTransaction transaction = connection.BeginTransaction();
    
            // exeução do comando no banco de dados
            string selectQuery = "SELECT COD_ESTOQUE, NOME, PRECO_VENDA, GRUPO FROM ESTOQUE WHERE COD_ESTOQUE = @ICOD_ESTOQUE";
            FbCommand command = new FbCommand(selectQuery, connection, transaction);
            command.Parameters.Add("@ICOD_ESTOQUE", produtoCodigo);
            FbDataReader leitor = command.ExecuteReader();
    
            try
            {
              if (leitor.Read())
              {
                meuProduto.ProdCodigo = leitor.GetString(0);
                meuProduto.ProdDescricao = leitor.GetString(1);
                meuProduto.ProdPreco = leitor.GetFloat(2);
                meuProduto.ProdGrupo = leitor.GetString(3);
              }
              else
              {
                meuProduto.ProdCodigo = "";
                meuProduto.ProdDescricao = "";
                meuProduto.ProdPreco = 0;
                meuProduto.ProdGrupo = "";
              }
              return meuProduto;
            }
            catch (Exception e)
            {
              throw new Exception();
            }
            finally
            {
              leitor.Close();
            }
          }
    

     

    E mude tambem essas propriedades:

     

            cs.ConnectionTimeout = 15;
            cs.MaxPoolSize = 200;

    Para

            cs.ConnectionTimeout = 2;
            cs.MaxPoolSize = 10;

     

    Abraço,

     

    Att

    Evandro

     


    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    sexta-feira, 17 de setembro de 2010 17:26
  • Olá André!

     

    Consegui solucionar o problema.

    Baixei a versão mais atual do Firebird .Net Provider e instalei no servidor.

    Na connection string alterei as seguintes configurações:

     

            cs.MaxPoolSize = 100;
            cs.Pooling = false;

    Já consegui realizar 450 lançamentos sem problema algum, agora vou para o cliente.

    Abraço e obrigado.

     

    Leonardo Freitag

    segunda-feira, 20 de setembro de 2010 23:18