webForumDet fria alternativet
Logga in / Bli medlem

JNDI problem

Java

3 svar · 215 visningar · startad av Jaar

Medlem sedan juli 2001434 inlägg
Frågan#1

Har precis skapat en datasource till min oracle databas i Tomcat som jag börjat använda.
Tidigare så registrerade jag drivern i koden och hämtade en connection:

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
return DriverManager.getConnection "jdbc:oracle:thin:@IP:1521:ORCL","USER","PASS");

Nu när jag kör JNDI så funkar inte ett anrop till en store procedure. Proceduren tar en Cursor som inparameter som jag sedan försöker läsa ut:

rs = ((OracleCallableStatement) cstmt).getCursor(1);

Felet som sker är java.lang.ClassCastException, dvs att den inte klarar att konvertera pekaren. Dock har den lyckats med det tidigare och det ska inte vara några problem med koden. Antar att det är någon inställning eller att JNDI funkarp å något annorlunda sätt.

Medlem sedan juli 2001434 inlägg
#2

Tänkte ta upp o jobba med det här problemet igen.
Det visade sig att det varså att man inte fick oracles klass, utan en "vanlig klass".

Skapar connection så här:

Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

och så här ser server.xml ut (satt upp med admingränssnittet)

          <Resource auth="Container" description="DB Connection" name="jdbc/DEVELOP" scope="Shareable" type="javax.sql.DataSource"/>
          <Resource auth="Container" name="jdbc/myoracle" scope="Shareable" type="javax.sql.DataSource"/>
          <Resource auth="Container" description="DB Connection" name="DEVELOP" scope="Shareable" type="javax.sql.DataSource"/>
          <ResourceParams name="jdbc/myoracle">
            <parameter>
              <name>url</name>
              <value>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</value>
            </parameter>
            <parameter>
              <name>validationQuery</name>
              <value>select count(*) from usr.table</value>
            </parameter>
            <parameter>
              <name>maxIdle</name>
              <value>10</value>
            </parameter>
            <parameter>
              <name>maxActive</name>
              <value>20</value>
            </parameter>
            <parameter>
              <name>driverClassName</name>
              <value>oracle.jdbc.driver.OracleDriver</value>
            </parameter>
            <parameter>
              <name>maxWait</name>
              <value>-1</value>
            </parameter>
            <parameter>
              <name>username</name>
              <value>usr</value>
            </parameter>
            <parameter>
              <name>factory</name>

<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
            </parameter>
            <parameter>
              <name>password</name>
              <value>pwd</value>
            </parameter>
          </ResourceParams>

Connection är av typen :
org.apache.commons.dbcp.PoolableConnection (det är den som senare spottar ut sig callable statementet som inte går att använda).

Någon som har något tips av något slag?

Medlem sedan apr. 200357 inlägg
#3

Testa att köra detta istället:

rs = (ResultSet) cstmt.getObject( 1 );

Medlem sedan juli 2001434 inlägg
#4

Tack ska du ha, det verkar som om det fungera! *bockar o tackar*

263 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)