[RESOLVIDO]Java & BD (DataSource): como fazer JoinTable com tabelas em BD's de Servidores distintos?

1 resposta
gilbueno

Boa tarde a todos,

utilizo DataSource para conectar ao BD,
possuo um dataSource para cada BD a qual me conecto

preciso fazer um join
dos dados da tabela “x_cache” do bd “x_cache” que está no servidor de ip “x.105”
com os dados da tabela “y_main” do bd “y_main” no servidor de ip “y.110”
as duas tabelas possuem uma coluna chamada “xy_id” e quero
que as duas tabelas sejam ligadas por este campo (where x_cache.xy_id=y_main.xy_id)
(nomes ficticios)

pra fazer o join acho q da pra criar uma view ou uma proxy table, não sei

mas será que da pra fazer isso usando DataSource?
como fazer? (mesmo sem DataSource, não quero a receita, só quero um rumo)

Muito obrigado a todos :slight_smile:

(não sei pq deletaram meu post anterior, isso não é uma duvida de java avançado? :?)

1 Resposta

gilbueno

Consegui resolver meu problema pois na verdade eu não precisava conectar 2 servidores diferentes, precisava apenas conectar 2 BD’s diferentes
entretanto perguntei a um mestre no assunto e ele me respondeu o seguinte:


Cada gerenciador de BD possui uma nomenclatura específica para esta estrutura.
No MySQL, o nome é “federated” table.
Para que isto funcione, provavelmente, o banco deve ter sido configurado com a opção específica. Algo como,

–with-federated-storage-engine

e ativado com esta possibilidade.

–federated
Primeiramente, a tabela remota deve existir. Consulte se pode ser qualquer tipo de tabela

CREATE TABLE federated_table ( . . .)

ENGINE=FEDERATED
CONNECTION=‘mysql://usuario:senha@remote_host:9306/db_name/table_name’;
Você também pode usar a seguinte sequência:

  1. Create server…
  2. Em seguida, criar a “federated” table. Simplifica a especificação do parâmetro CONNECTION.

Obs.: Não posso fazer afirmações sobre a eficácia desta solução, nem sobre possíveis problemas. Dependendo da situação, pode pensar numa solução de replicação para não depender da disponibilidade da instância remota.

Para conectar diversos BD’s do mesmo servidor é só usar um resource sem especificar o banco de dados, apenas o servidor:

<jdbc-resource enabled="true" object-type="user" jndi-name="nomeDoJNDI" pool-name="NomeDaConnectionPool"/>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false"
                        connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10"
                        connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0"
                        connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
                        fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false"
                        is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false"
                        match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000"
                        name="NomeDaConnectionPool" non-transactional-connections="false" pool-resize-quantity="2"
                        res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8"
                        validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="User" value="user"/>
    <property name="Password" value="abc123"/>
    <property name="serverName" value="x.x.x.105"/>
    <property name="URL" value="jdbc:mysql://x.x.x.105/"/>
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  </jdbc-connection-pool>

e na query vc especifica os BD’s:

SELECT *.x, *.y FROM x_BD.x_TABELA AS x, y_BD.y_TABELA AS y WHERE x.xy_id = y.xy_id
Criado 18 de novembro de 2010
Ultima resposta 25 de nov. de 2010
Respostas 1
Participantes 1