[Resolvido] Pool de conexões resolve essa lista de problemas no firebird?

2 respostas
alexfe

Galera blz, preciso da ajuda de vcs, existe um projeto legado aqui na empresa onde trabalho e o mesmo veio para nós damos manutenção nele. Queria saber da opinião de vcs visto a lista de problemas abaixo se a mudança que estou propondo fazer irá solucionar ?

Problemas

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544329. invalid BLOB ID at
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544336. deadlock
update conflicts with concurrent update No message for code 335544878 found at
Erro: GDS Exception. 335544569. Dynamic SQL Error 335544569
SQL error code = -504
Invalid cursor reference
Cursor is not open
Erro: GDS Exception. 335544332. invalid transaction handle (expecting explicit transaction start)
Erro: GDS Exception. 335544336. deadlock
update conflicts with concurrent update
No message for code 335544878 found.
Erro: Resource Exception. Local transaction active: can't begin another
org.firebirdsql.gds.impl.GDSHelper.fetch(268)
org.firebirdsql.jdbc.FBStatementFetcher.fetch(201)
org.firebirdsql.jdbc.FBStatementFetcher.next(119)
org.firebirdsql.jdbc.AbstractResultSet.next(250)

Mudança

Hoje a conexão está sendo feita assim
public static void conectar() {
    try {
      Class.forName("org.firebirdsql.jdbc.FBDriver");
      
      connection = DriverManager.getConnection(Variaveis.caminhoBanco, ParametrosLocais.getParametro(ParametrosLocais.USER_BANCO), ParametrosLocais.getParametro(ParametrosLocais.PASS_BANCO));

      connection.setAutoCommit(false);
      connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
      isConnected = true;
    }
    catch (ClassNotFoundException cnfex) {
      isConnected = false;
      ultimoErro = cnfex.toString();
    }
    catch (SQLException sqlex) {
      sqlex.printStackTrace();
      isConnected = false;
      ultimoErro = sqlex.toString();
    }
  }

Eu sei muito bem que a conexão dessa forma da problema mas o pessoal não acredita :( e a solução que proponho é mudar para pool de conexões geranciado pelas propria API do firebird

public static void conectar() {
    try {
      String caminhoBanco = Variaveis.caminhoBanco;// jdbc:firebirdsql:127.0.0.1/23050:/home/alex/apoio/apoio.fdb?lc_ctype=WIN1252
      caminhoBanco = caminhoBanco.replace("jdbc:firebirdsql:", "");
      caminhoBanco = caminhoBanco.replace("?lc_ctype=WIN1252", "");

      FBWrappingDataSource pool = new org.firebirdsql.pool.FBWrappingDataSource();
      pool.setMaxPoolSize(5);
      pool.setMinPoolSize(2);
      pool.setMaxStatements(300);
      pool.setMaxIdleTime(30 * 60 * 60);
      pool.setDatabase(caminhoBanco);
      pool.setPooling(true);
      pool.setCharSet("WIN1252");
      pool.setUserName(ParametrosLocais.getParametro(ParametrosLocais.USER_BANCO));
      pool.setPassword(ParametrosLocais.getParametro(ParametrosLocais.PASS_BANCO));
      pool.setUseStreamBlobs(true);
      
      connection = pool.getConnection();
      connection.setAutoCommit(false);
      connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
      isConnected = true;

    } catch (Exception sqlex) {
      sqlex.printStackTrace();
      isConnected = false;
      ultimoErro = sqlex.toString();
    } finally {
      try {
        connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

Alguém já passou por esse problema e sabe me responder se estou no caminho certo ?

2 Respostas

alexfe

Alguém ?

alexfe

Respondendo a mim mesmo, sim resolve :slight_smile:

Criado 8 de setembro de 2015
Ultima resposta 10 de out. de 2015
Respostas 2
Participantes 1