Ola pessoal, há uns 10 meses atras eu tive que fazer um programinha em visual basic :alien!: arghhh, esse programinha pegava dados a cada 10 segundos num banco sql server. Os dados na verdade eram gerados por sensores em salas de predio onde ficavam servidores (CTBC Telecom), tudo tinha que ser monitorado, mas os dados eram jogados para o Oracle, entre esses dois bancos um cara criou uma ponte escrita em java, que a cada novo evento ele tirava do oracle e jogava no sql para mim, eu nunca mais vi esse cara para mim perguntar o que ele fez, mas fica a pergunta: como ele alimentava o sql em tempo real? Apenas novos eventos eram inseridos no sql.
Ponte em java entre oracle e sql server
25 Respostas
Não poderia ser uma trigger no Oracle escrita em Java que acessava o SQL Server e inseria os dados?!?
Sim poderia 
Nao, eu vi o cara escrevendo uma parte do código, ele baixou o runtime do java para executa-lo na máquina, o programa fica rodando o tempo todo lá. Com certeza não é trigger.
Deve ser um agente (uma thread) que fica rodando o tempo todo, fazendo SELECTs para ver se novos dados foram inseridos no Oracle.
Até ai tudo certo, mas como ele coloca só os dados novos no sql sem duplica-los?
Eu é que te pergunto isso. Já tentou olhar o código Java?
Que tal um campo com data/hora do registro? Isso pode dizer quais são os novos registros.
Olá
Não sou DBA e muito menos conheço tão bem assim SQL Server. Vou responder mais ou menos de orelhada.
O que quer fazer parece o que se chama de “replicação transacional”, isto é, um agente de replicação monitora quem publica as modificações na base de dados e as transmite para quem as subscreve. Esta transmissão pode ocorrer imediatamente ou periodicamente.
Para isto parece que há nas versões mais novas do SQL Server, serviços chamados DTS (Data Transformation Services) (DTS) que podem empurrar dados para o Oracle através OLE DB. Outra solução vem de um negócio do Oracle chamado “Heterogeneous Services” que acho que apareceu no Oracle 8, permitindo conectar diretamente as 2 bases via ODBC.
Como não sei qual versão das bases de dados usa e porque é assim que quer a solução, vou sugerir um modo programado que consiste em criar tabelas contendo somente as alterações. Um programinha ficaria monitorando estas tabelas e então atualizaria a outra base. As tabelas com as alterações seriam muito menores do que as originais e a performance poderia ser aceitável. O ideal é que as tabelas com as alterações fossem populadas por triggers.
[]s
Luca
Eu não tenho mais acesso ao sistema, fiz o programinha e “piquei a mula”, só sei que nao é nem um processo automatizado do oracle muito menos do sql server, nem nada a ver com o odbc, o cara me contratou me disse que eu tinha que esperar o cara terminar a tal ponte pra mim obter os dados, eu sei que é java por que o cara disse que era e eu vi ele escrevendo uma parte do codigo, e tambem por ter baixado a JVM. E os dados precisam ir para o SQL para ser tratado, pois os dados serão alterados por usuarios, e o banco oracle não pode ficar sobrecarregado de jeito nenhum, os locais que estao sendo vigiados pelos sensores que geram os eventos sao onde estao os servidores que fazem nao sei o que para a companhia telefonica, por isso tanto cuidado… Se alguem tiver mais alguma idéia…
Já que é um projeto tão importante, manda os malas dos diretores abrirem a mão e colocar um espelhamento com Oracle. O Oracle gerencia isso tudo pra você.
Ah! Se bem que depois de instalado você perde o emprego, né. Pois o Oracle faz tudo sozinho. hHeheheheheh.
Mas sério agora… sua dúvida é???
Você perguntou mas não esclareceu ainda! 
Desculpem-me se não deixei claro, tudo isso já aconteceu, o cara já fez a ponte e eu já piquei a mula, nem trabalho lá, foi só um bico, eu gostaria de saber como o cara está diferenciando os dados que acabaram de chegar no oracle e jogá-los no sql sem ter duplicação, e isso em tempo real, mesmo se for por marcação de hora, como ele garante que nao tem registro ficando para trás, por exemplo ele faz uma consulta nova, mas neste instante um novo evento foi gerado mas como ele consultou a base, o programa poderia interpretar como registro ja tratado…
Olá
Reli sua mensagem inicial e agora que percebi que seu problema era publicar no Oracle e subscrever no SQL Server. Então assim acho que o DTS não funciona. Mas como o Daniel disse, o Oracle tem estas facilidades. Veja em http://otn.oracle.com/products/oracle9i/datasheets/gateways/gateway_rel2_ds.html
Para reinventar a roda e fazer tudo via programação ainda acho que a solução “meia boca” que lhe passei com as tabelas contendo só as modificações vai funcionar com performance aceitável.
Também estou curioso: afinal o que quer mesmo saber?
[]s
Luca
Tabela: XYZ
Campos:
ABC1 : number(5)
DEF2 : varchar2(50)
HHH99 : varchar2(30)
DATA_REG : timestamp
SELECT ABC1, DEF2, HHH99 FROM XYZ
WHERE DATA_REG >= :dataHoraUltimaAtualizacao
while( existeRegistrosNoResultSet ) {
if( existeRegistroComAMesmaPK ) {
Atualiza no SQL SERVER
} else {
INSERE no SQL SERVER
}
}
Será que ajuda o quer o código pronto?
Valeu vou dar uma olhada, acho que tambem fica melhor assim. Na verdade eu queria saber como é que o cara juntou as “catracas” e fez aquela coisa medonha funcionar, eu nem preciso disso, mas sei que vou precisar e gostaria de ter alguma ideia… Valeu
Eu to com um problema meio parecido.
Um cliente nosso quer um sistema offline de pedidos (swing). E de tempos eles se conectam e sincronizam a base local com a do servidor.
Mas eles não querem gastar mais uma grana para comprar mais licensas Oracle.
O que terá de ser feito?
- Sincronizar base local (Access) com um MySQL no server.
- Sincronizar MySQL com Oracle, em batch.
Pergunta? Será que não gastar 40 mil dólares com Oracle justifica esse trabalho, para uma empresa que DEPENDE disto?
hummm … valeu a bricadeira de advinha … mas já que você vai fazer de novo, porque, ao invés de tentar imitar uma solução que nem você que viu sabe como é, você não tenta fazer uma direitim direitim?
Tipo, se não for usar replicação nativa do banco de dados pelo menos vai pelo caminho de triggers que o Luca citou, terá boa performance e você terá melhor controle (esquece a thread fazendo selects, overhead demais pra uma replicação de mentirinha)
Eu to com um problema meio parecido.Um cliente nosso quer um sistema offline de pedidos (swing). E de tempos eles se conectam e sincronizam a base local com a do servidor.
Mas eles não querem gastar mais uma grana para comprar mais licensas Oracle.
O que terá de ser feito?
- Sincronizar base local (Access) com um MySQL no server.
- Sincronizar MySQL com Oracle, em batch.
Pergunta? Seria que não gastar 40 mil dólares com Oracle justifica esse trabalho, para uma empresa que DEPENDE disto?
Hummm DEPENDE. ehehehe … depende de quanto ele vai gastar pra ter essa solução funcionando na prática. Na teoria é mais facil do que na pratica porque você tem que gerenciar concorrencia por conta (já que vai estar offline), qd for fazer o sincronismo vai ter que ter um mecanismo pra trabalhar inconcistencia e que no minimo seja espertinho pra ajudar o usuario a tentar resolver essas inconcistencias entre outras coisas que agora não lembro.
Se não for tao cabeludo o problema é porque na verdade você não tem um problema e ele não devia estar usando Oracle desde o começo :shock:
e $40K é muito … uma licenca Standard por processador custa $15k (sem limite de usuarios) e já te dá todo esse suporte.
Isso fica legal quando vc está só em ambiente windows, mas e quando está voce tá numa empresa que é uma “mistureba”, de SO, fica mais dificil fazer esse tipo de replicação…
Na verdade eles têm o Oracle Enterprise Edition: 40K por processador. Os vendedores não têm licensa para uso.
Mas, para quem engavetou um People Soft (400K gastos), acho que todo o projeto começou errado.
Começou BEM, termina ERRADO.
Começou ERRADO, …
Olá
Daniel,[list]1) 5 licenças do Oracle 9i não custam mais do que mil dólares e no servidor vc vai usar menos do que isso.
2) Nunca use o Access para nada;
3) Nunca use o Access a menos que goste de viver perigosamente;
4) Nunca use o Access mesmo para guardar a lista dos seus inimigos.
5 até 50000) Nunca use o Access[/list]Para fazer o que quer, a base local pode ser o MySQL ou o Hypersonic (hsqldb) ou o McKoi (ou o PostgreSQL no Linux) e todos serão melhores do que o Access.
[]s
Luca
E ai Luca,
- Oracle EE por processador = 40K USD (preço de tabela)
- Eles precisariam de no mínimo 40 licenças, o que justifica a compra do EE por processador. (Já vendí Oracle).
- Peguei a dica do cv para usar o hsqldb.
- Access eu tô ligado que SUCKS.
- O Sitema precisa que o Banco rode Embbeded, pois não quero sobrecarregar o processador com MAIS um serviço rodando.
6 a 50000) Aquela Aline Moraes é muito gostosa.
Olá
Daniel, vc devia ser um excelente vendedor Oracle porque para mim nem sempre acho necessário comprar a versão EE. Por exemplo: para fazer um correspondente bancário com uns míseros mil terminais Swing com um throughput de uns 40 a 60tps acho que um Oracle 8i Standard Edition rodando em um AIX ou até mesmo em um Linux podem atender perfeitamente. Talvez ainda encontre a versão 9i em algum revendedor por precinho camarada, mas a 10g /5users está por US$745. Segundo a Oracle: Standard Edition One includes everything necessary to build and deploy business-critical applications on single servers up to 2 processors.
A versão EE é boa para quem vai fazer BI, aplicações usando features OLAP ou data mining da Oracle. Ver planilha comparativa em: http://www.oracle.com/database/index.html?product_editions.html
[]s
Luca
Eles já têem o Oracle EE pois veio com o BPCS… Não conheço este sistema, mas usam pra financeiro e etc.
A diferença do EE pro SE é apenas a licensa. No EE vc PODE instalar as ferramentas gerencias e etc.
Mas no 10G EE isso tudo já vem junto.
Tabela: XYZ Campos: ABC1 : number(5) DEF2 : varchar2(50) HHH99 : varchar2(30) DATA_REG : timestampSELECT ABC1, DEF2, HHH99 FROM XYZ WHERE DATA_REG >= :dataHoraUltimaAtualizacao while( existeRegistrosNoResultSet ) { if( existeRegistroComAMesmaPK ) { Atualiza no SQL SERVER } else { INSERE no SQL SERVER } }Será que ajuda o quer o código pronto?
Ao invés de guardar a data da última atualização e também adicionar um campo na tabela, não seria mais fácil utilizar o ROW_ID? Claro, seguindo essa linha de raciocínio, visto que outras soluções melhores já foram discutidas...
[]'s
Mas, e em caso de update???
Por isso a necessidade de um TIMESTAMP.
uheheheh porque não falou antes que era BPCS ?!? Entonces não estamos falando de uma empresinha que usa access (pelo amor de Deus, esse sistema da irch em qualquer um, a manutenção e uso dele é pra enterrar dinossauro na folha de pagamento :shock: ).
Estamos falando de uma empresinha que usa BPCS … só não entendo porque tão regulando uma solução descente com Oracle mesmo já que eles gostam de gastar uma graninha.
Vai pelo caminho da trigger, pelo menos você usa o servidor parrudinho do Oracle a seu favor (já que nada mais está a seu favor).
Ou procure uma solução pronta.
Bom, os caras quer fazer um projeto relativamente grande com ZERO de custo. NUNCA vai sair do jeito que deveria né.
Mas como eu não apito na grana…