Conectando vários bancos Progress no mesmo acesso ODBC/JDBC

Escrito por Adriano Corrêa em 26 de janeiro de 2009, 08:10h

A partir da versão 10.1B o Progress permite conectar mais de um banco de dados no mesmo acesso ODBC ou JDBC, possibilitando executar queries de consulta nos vários bancos utilizados.

Esse acesso possui severas limitações:

  1. A conexão é feita em dois passos: Conecta-se o primeiro banco (primário) e depois conecta-se os demais (catálogo).
  2. Ambos devem estar na mesma máquina. Quem faz o acesso ao banco catálogo é o processo _sqlsrv2 no banco primário.
  3. Apenas o banco primário poderá sofrer alterações. Os bancos "catálogo" são conectados apenas para leitura.
  4. O banco primário é conectado obrigatoriamente em modo cliente-servidor. Os bancos "catálogo" são conectados obrigatoriamente em modo self-service (acesso direto à shared-memory).
  5. O usuário e senha usados na conexão do banco primário serão usados para conexão dos bancos catálogo.

Quando ocorre uma conexão SQL, o Progress inicia para o banco de dados um processo server (_sqlsrv2) para estabelecer o acesso. Esse processo poderá ser identificado no promon como SQSV. Quando o número mínimo de usuários por servidor for atingido (-Mi) o processo inicia um novo processo server, e assim por diante, até estourar a quantidade de servers permitido (-Mn ou -Mpb).

Quando ocorre uma conexão a um banco catálogo, o Progress estabelece uma conexão chamada SQFA (SQL Federated Agent). Essa conexão é equivalente ao SQSV, porém sem o processo _sqlsrv2 associado. O acesso real do usuário é reconhecido no Progress como SQFC (SQL Federated Client). Da mesma forma que o SQSV, um novo SQFA é criado quando estoura o parâmetro -Mi.

É possível conectar um banco catálogo de duas formas:

Da forma manual, execute o comando: connect 'c:\banco\demo' as catalog demo; .

Da forma automática, utilize o parâmetro -mdbq. Simulei essa situação conforme o exemplo a seguir:

Criei dois bancos de dados exemplo, a partir dos bancos sports e demo, que a Progress disponibiliza. Serví ambos com os comandos:
proserve sports -S 30000
proserve demo -S 40000

Vou conectar o banco sports como primário e o banco demo como catálogo. Dessa forma, criei no diretório do banco de dados sports, o arquivo sports.oesql.properties com o seguinte conteúdo:

[sql-configuration]
configuration-names-list=cfgTeste

[configuration.cfgTeste]
database-id-list=dbdemo

[database.dbdemo]
Name=dbdemo
Catalog=demo
Location=d:\workarea\catal\demo

Com o arquivo configurado, abrí o SQL Explorer com a seguinte sintaxe:

sqlexp -db sports[-mdbq:cfgTeste] -H localhost -S 30000 -N TCP

Dentro do SQL Explorer, executei o seguinte comando para verificar os bancos conectados:

show catalogs all;

Ele apresentou a seguinte informação:

PRO_NAME                         PRO_TYPE  PRO_STATUS
-------------------------------- --------- ----------
SPORTS                           primary   default
DEMO                             auxiliary notdefault

Esse é um exemplo de conexão utilizando JDBC. Para conexão ODBC, proceda da mesma forma, adicionando o parâmetro -mdbq no nome do banco especificado no DSN.

Categorias: Banco de dados | Conectividade | Novidades | Progress

Tags: , , ,

Comentários (7) -

em 23 de março de 2009, 14:34h

Adriano, primeiramente parabens pelas publicacoes. Bom, estive utilizando esse procedimento para configurar uma ODBC. A intencao e conectar 10 bancos de dados do produto Datasul EMS (ambiente distribuido) e utilizar a ferramenta de relatorios Crystal Reports. Estive testando as versoes do Crystal 11 e 2008 e nas duas tive o seguinte problema: enxergo apenas as tabelas do banco primario...as demais tabelas dos outros bancos nao ficam disponiveis. Saberia me dizer se existe alguma restricao de acesso nesse tipo de ODBC com varios bancos? Obrigado.

Ari Eduardo de Toledo

em 23 de março de 2009, 16:14h

Ari, nesses casos eu sempre tento retornar dados para uma planilha Excel. Fiz o mesmo teste descrito desse artigo e montei a seguinte query com o Microsoft Query:

select demo.pub.customer.name, sports.pub.customer.name from demo.pub.customer inner join sports.pub.customer on demo.pub.customer."cust-num" = sports.pub.customer."cust-num"

Essa query não faz sentido algum, mas serve para testar se os dados são retornados de ambos os bancos. Esse teste concluiu com sucesso.

O que pode estar acontecendo é alguma deficiência da ferramenta gráfica para navegar nas tabelas pelo Crystal Reports. Tive esse mesmo problema com o Excel. Porém funcionou montando manualmente a query pelo Microsoft Query.

Nesse caso, acredito que o melhor caminho seja procurar pelo suporte do Crystal Reports. Talvez essas versões não estejam preparadas para trabalhar com catálogos.

Adriano Corrêa

adriano

em 26 de agosto de 2009, 08:47h

Apenas para complementar, ambos os bancos envolvidos nesta conexão precisam ter o mesmo código de página, senão não conectam.
Fonte: www.progress.com/support
KBase: p132846

Eloi Rene Pscheidt

eloi

em 29 de janeiro de 2010, 10:43h

Bom dia,
No exemplo colocado no post, a configuração do catálogo possui o endereço do banco (Location=d:\workarea\catal\demo). Como devo proceder quando as bases estão em outro servidor. Exemplo: Estou em uma estação (Client) X e as bases estão no servidor Z.
Como devo proceder a configuração do ODBC nessa estação.

Claide Eder Dias Matheus

em 29 de janeiro de 2010, 15:46h

Claide, dessa forma a sua aplicação deverá conectar dois DSN's, um para cada banco. Essa forma de acesso funciona apenas quando os bancos estão no mesmo servidor.

Adriano Corrêa.

adriano

em 24 de novembro de 2011, 16:18h

Tem como fazer isso no progress 10.1A ?
Pois, estou precisando acessar 2 bancos via ODBC

cesar

em 28 de novembro de 2011, 10:01h

Cesar,

A funcionalidade de acessar vários na mesma conexão é nova no OE 10.1B. No 10.1A você deve abrir uma conexão para cada banco de dados.

kirchner

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading


Acesso LogMeIn

Informe o código PIN: