JNDI problem

Java

3 svar · 220 visningar · startad av Jaar

Medlem sedan juli 2001434 inlägg
Trådstart#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*

267 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)