[firebase-br] Firebird ADO.NET Data Provider.

Leonardo Vinicius Freitag freitagnx em gmail.com
Qua Set 15 14:49:11 -03 2010


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.NETData 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.



Mais detalhes sobre a lista de discussão lista