java.lang.ClassCastException: oracle.sql.CLOB usando JNDI

Rao!!!

Estava eu num projeto em Java com Oracle. E resolvi utilizar o pool de conexões do tomcat, pois minha aplicação estava ficando lenta.

Antes:

Class.forName(”oracle.jdbc.driver.OracleDriver”);
this.conn = DriverManager.getConnection(”jdbc:oracle:thin:@127.0.0.1:1521:DB_EXEMPLO”, “usuario”, “senha”);

depois:

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup(”java:/comp/env”);
DataSource ds = (DataSource)envContext.lookup(”jdbc/exemplo“);
this.conn = ds.getConnection();

Alterei também o arquivo de contexto da aplicação tomcat: “apache-tomcat-5.5\conf\Catalina\localhost\exemplo.xml”

<Context path=”/exemplo” reloadable=”true” docBase=”F:\XXX\exemplo” workDir=”G:\XXX\exemplo\work”>
<Resource name=”jdbc/exemplo” auth=”Container” type=”javax.sql.DataSource”
username=”xxxx” password=”yyyy”
driverClassName=”oracle.jdbc.driver.OracleDriver”
url=”jdbc:oracle:thin:@127.0.0.1:1521:
DB_EXEMPLO
maxWait=”-1″
removeAbandoned=”true”
maxActive=”10000″
maxIdle=”20″
removeAbandonedTimeout=”180″
logAbandoned=”true”
accessToUnderlyingConnectionAllowed=”true”
/>
</Context>

Até ai, tudo na santa paz!

Até eu utilizar o campo Clob! Dando o seguinte erro:

java.lang.ClassCastException: oracle.sql.CLOB
at midiaweb.Dao.populaVO(Dao.java:759)
at midiaweb.Dao.getLista(Dao.java:625)
at midiaweb.servlet.ServletLogin.execute(
ServletLogin.java:39)
at midiaweb.ServletPai.doGet(ServletPai.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Unknown Source)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:52)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Unknown Source)

E aqui o fonte de onde ocorreu o erro:

oracle.sql.CLOB objTeste = rs.getClob(”CAMPO_CLOB”);
if (objTeste!= null) {
System.out.println(objTeste.getClass().getName());
//resultado “oracle.sql.CLOB”
oracle.sql.CLOB clob = (oracle.sql.CLOB) objTeste;
//ERRO AQUI
String valor = this.getClob(clob);

Com o teste, notei que o objTeste era um “oracle.sql.CLOB” e o objeto clob também era um “oracle.sql.CLOB”.

Então pensei, como isso é possível?

Depois de quebrar a cabeça, pensei!!!

1. Para levantar um erro de Cast, e as classes têm o mesmo nome, então deve haver 2 versões do pacote.

2. E, como o JNDI é uma biblioteca e faz parte do tomcat, logo a classe que ele me retorna, não é uma classe do lib do meu projeto

Removi a biblioteca que estava no lib do meu WEB_INF, no caso era “classes12.jar”, e bimba! (é claro que no eclipse, para poder compilar, coloquei a referência para o pacote, senão não compila)

Ou seja, havia 2 pacotes exatamente iguais. Usando JNDI havia uma refência e em minha aplicação outra!

Espero que ajuda! falowww!

4 Respostas para “java.lang.ClassCastException: oracle.sql.CLOB usando JNDI”

  1. Luciano Lorencini Disse:

    Interessante!

    Estou passando por problema idêntico, só que utilizando JBoss 4.2.1.

    Este “classes12.jar” é um pacote de driver Oracle, certo? No meu projeto não tenho ele especificamente, mas tenho a “ojdbc13.jar”. Agora, não sei se esta library vêm em uma instalação padrão do JBoss, a ponto de estar acontecendo este conflito de classes “oracle.sql.CLOB” como sugerido por você. Mesmo assim, vou verificar.

    Só tirando uma dúvida: no TomCat que você utilizou como teste, existia a library classes12.jar? Se sim, ela já veio no TomCat, ou você (ou outro desenvolvedor) a colocou lá?

    No mais, ótimo blog!!

    Abraços de Vitória-ES

  2. Gregui Shigunov Disse:

    Opa!
    Sim, este pacote serve para conectar com oracle! o jboss e o tomcat não veem com esse pacote! Se não me engano eu baixei no site da oracle! Vou te enviar por emai esse pacote! espero que ajuda! qualquer coisa estou a disposição em caso de dúvidas!

    Abraços!

  3. Rafa Disse:

    Entao cara, meu problema é que possuo o classes12 no Tomcat mas precisaria utilizar do ojdbc por conta dos campos CLOB, teria como eu add o ojdbc em web-inf\lib e fazer menção a ele pra utilizar, invez do padrao do tomcat ?

    Nao gostaria de remover o outro pacote por conta de outros sistemas.

    Forte abraço
    Rafael

  4. Gregui Shigunov Disse:

    Não testei mas talvez funcione se:
    vc jogar o jar no lib do projeto!
    depois criar uma outra classe que implementa a classe ”oracle.jdbc.driver.OracleDriver”

    class OracleDriveNovo extends oracle.jdbc.driver.OracleDriver {}

    Ai no xml vc muda:
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    para
    driverClassName=”pacote.qualquer.OracleDriverNovo”

    Ai o tomcat não irá instanciar o ”OracleDriver” que está no servidor tomcat e sim a classe do projeto!

    Só não sei se irá funcionar! Mas vale a pena tentar!

Deixe um comentário