Base Legada DB2 - Heeeelp!
01/03/2013 12:48
0
Bom dia, Comunidade!

Onde trabalho temos um sistema que utilizada o IBM DB2 como banco de dados.

Ia fazer uma experiência usando o plugin de engenharia reversa, mas sequer consegui me conectar ao banco pelo Grails.

1 - Baixei os drivers 'db2 for jdbc sqlj' (db2jcc.jar, db2jcc4.jar e outros arquivos)

2 - Coloquei na pasta /lib do projeto

3 - Meu DataSource.groovy alterei para

dataSource {
pooled = true
driverClassName = "com.ibm.db2.jcc.DB2Driver"
dialect = 'org.hibernate.dialect.DB2Dialect'
username = "xxxxxxxxxx"
password = "yyyyyyyyyy"
}


e também

environments {
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:db2://192.168.0.105:50001/BCRMPITA"
}
}
...
}
[code]

.
.
.

Mas ao tentar dar "start" na aplicação.. só para testar dá o erro abaixo... onde é recorrente a expressão "Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'"

[code]
| Running Grails application
| Error 2013-03-01 09:44:26,809 [Thread-7] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'lobHandlerDetector' while setting bean property 'lobHandler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'lobHandlerDetector' while setting bean property 'lobHandler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
Line | Method
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'lobHandlerDetector' while setting bean property 'lobHandler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'lobHandlerDetector' while setting bean property 'lobHandler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Caused by MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Caused by SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
->> 1429 | createConnectionFactory in org.apache.commons.dbcp.BasicDataSource
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1371 | createDataSource in ''
| 1044 | getConnection in ''
| 334 | innerRun in java.util.concurrent.FutureTask$Sync
| 166 | run . . . in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread

Caused by ClassNotFoundException: com.ibm.db2.jcc.DB2Driver
->> 366 | run in java.net.URLClassLoader$1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 355 | run in ''
| 354 | findClass in java.net.URLClassLoader
| 423 | loadClass in java.lang.ClassLoader
| 356 | loadClass in ''
| 1420 | createConnectionFactory in org.apache.commons.dbcp.BasicDataSource
| 1371 | createDataSource in ''
| 1044 | getConnection in ''
| 334 | innerRun in java.util.concurrent.FutureTask$Sync
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread

Process finished with exit code 1




Alguém poderia me ajudar a fazer essa conexão?

Uma alternativa (não muito certa) acho que seria conectar-me a um MS Access e ele deixar vinculado ao banco
Tags: DB2, Base Legada, Jdbc, Driver, Help


0
Suas classes de domínio estão mapeadas para as suas tabelas do DB2?


0
Não henrique. Na verdade eu não criei nenhuma classe de domínio ainda.

A Ideia seria testar o plugin de engenharia reversa e se não funcionar eu mapearia algumas tabelas para brincar com o grails..

O problema é que nem subiu a aplicação e é recorrente a expressão "Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'"

----------

Eu baixei o driver de diversos lugares para fazer o teste e nenhum deu....

Não teria que subir a aplicação mesmo sem classes de domínio?

Obrigado!
01/03/2013 18:24


0
Rafael, tem certeza de que os dois arquivos .jar tem de estar no seu classpath?
Talvez precise ter apenas um e ele esteja carregando o arquivo errado.

Não precisa ter classes de domínio para iniciar a aplicação: eu é que achei que talvez você tivesse por aí alguma classe que não tivesse sido mapeada ainda. :)


0
Henrique,

Vou investir um tempo nesses testes e posto o resultado aqui.

Acredito que esteja no diretório correto e os arquivo também.. mas vou fazer individualmente e caçar mais alguma informação na internet.

Obrigado
01/03/2013 19:14


0
Olá Rafael,

Eu já fiz um mapeamento de um banco legado (em SQL Server) com sucesso no Grails. Não foi só criar as classes de domínios, pois as tabelas possuem chaves primárias compostas. Isso dificultou o trabalho, mas foi possível fazer.

As dicas que dou são:

1. Embora eu tenha tentado fugir dos arquivos de mapeamento do hibernate hbm.xml, não foi possível. Eles devem ficar dentro de grails-app/conf/hibernate/pacotejava/*.hbm.xml. Onde pacotejava é o nome do package definido para as classes de domínio. No exemplo abaixo, o pacote se chama rest.

2. Como o banco possui tabelas com chaves primárias compostas, então é preciso criar classes que representem esses ids. Por exemplo, se vc tem a classe Client, então vc deve criar uma class com nome ClientId.

Note que Client.groovy (classe de domínio) fica dentro da pasta domain (o normal do grails)
Já ClientId.groovy fica dentro de src/groovy

Veja exemplo:

Client.groovy

package rest

import java.io.Serializable;
import java.util.Date;

class Client implements Serializable {
ClientId id
String name
String address1

static constraints = {
}

static hasMany = [itens:Item]

}


ClientId.groovy

package rest

import java.io.Serializable;

import org.apache.commons.lang.builder.HashCodeBuilder;

class ClientId implements Serializable {
String region
String code

boolean equals(other) {
if (!(other instanceof ClientId))
return false;

return other.region == region && other.code == code
}

int hashCode() {
def builder = new HashCodeBuilder()
builder.append(region)
builder.append(code)
return builder.toHashCode()
}
}


3. Para você recuperar um client vc deve escrever assim:


Client c = Client.get(new ClientId(region:"ABCD",name:"Teste"))


Note no código acima que não passamos mais um numero inteiro para o .get(), mas a classe que efetivamente representa o id.

4. Lembre-se de configurar essa classe de id dentro do seu hbm.xml, veja exemplo:


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated May 11, 2012 6:34:00 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="rest.Client" table="CLIENT">
<composite-id name="id" class="rest.ClientId">
<key-property name="region" type="string">
<column name="REGION" length="10" />
</key-property>
<key-property name="code" type="string">
<column name="CLICODE" length="40" />
</key-property>
</composite-id>
<property name="name" type="string">
<column name="CLINAME" length="360" />
</property>
<property name="address1" type="string">
<column name="ADDRESS1" length="240" />
</property>
<set name="itens" table="ITEM" inverse="true" lazy="true" fetch="select">
<key>
<column name="REGION" length="10" not-null="true" />
<column name="CLICODE" length="40" not-null="true" />
</key>
<one-to-many class="rest.Item" />
</set>
</class>
</hibernate-mapping>


Fiz alguns testes com tudo isso, o meu problema é falta de tempo para terminar. A minha ideia é fazer um service REST para obter informações desse banco legado. Além disso, fazer o mapeamento não é simples. Existe um plugin para hibernate que faz a engenharia reversa (deve ser o mesmo que vc tá usando), mas infelizmente ele não gera código groovy.
01/03/2013 23:10



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto