Schreiben Sie oracle 11.2 Datenbank aus java 8 via Tomcat 8.5.9 mit OraclePreparedStatement?

Ich habe Probleme beim schreiben in eine Oracle 11.2 Datenbank, die mit Java 8 mit Tomcat 8.5.9. Tatsächlich, der folgende code funktioniert gut für das schreiben einer gespeicherten Prozedur, aber ich bekomme einen Fehler beim schreiben auf die Datenbank direkt.

Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/myPool");
conn = ds.getConnection(); 

//The following works fine:   
cs = conn.prepareCall( "{call my_proc (?,?)}" );
cs.setString(1, var1);
cs.registerOutParameter(2, Types.VARCHAR); 
cs.execute();
out_var2 = cs.getString(2);

//The following results in a ClassCastException error:
sql ="INSERT INTO MY_TABLE1 (my_value1, my_value2) VALUES (?,?)";
ps = (OraclePreparedStatement) conn.prepareStatement(sql);

//The following results in the same error, but is an example of using Oracle extensions for setXXX():
sql="INSERT INTO MY_TABLE2 (my_value3, my_value4) VALUES (?,?)";
ps = (OraclePreparedStatement) conn.prepareStatement(sql);       
for (ii=0; ii<var100.length; ii++) {
     ps.setBinaryFloat(3,  my_value3[ii]);
     ps.setBinaryDouble(4, my_value4[ii]);
     ps.addBatch();
}
ps.executeBatch();

Der Fehler ist: java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement.

Ich habe vor kurzem den Wechsel von GlassFish auf Tomcat. Der Vorherige code, das funktioniert für Glassfish war:

OracleDataSource ods = ds.unwrap(OracleDataSource.class);
OracleConnection conn = (OracleConnection) ods.getConnection();
conn = ds.getConnection();
sql_a ="INSERT INTO MY_TABLE (my_value1, my_value2) VALUES (?,?)";
ps_a = (OraclePreparedStatement) conn.prepareStatement(sql_a);

aber es gibt die Fehler, java.lang.NullPointerException mit Tomcat.

Ich so konfiguriert haben, dass mein tomcat-Dateien mit dem folgenden link als Anleitung:

https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html

insbesondere den Abschnitt über Oracle 8i, 9i, & 10g (Kontext, Konfiguration und web.xml).

Irgendeine Idee, wie ich bekommen kann, beseitigen Sie die Tomcat-Fehlermeldung, wenn ich in die Datenbank schreiben und direkt, wobei auch die oben genannten code, um weiter zu arbeiten, wenn das schreiben an eine gespeicherte Prozedur?

  • Sie haben zu werfen Ihre vorbereitete Anweisung als OraclePreparedStatement? Ist es nicht ausreichend für Sie, um eine PreparedStatement?
  • Danke @DanielBarbarian, ich bin die umfassende Nutzung von Oracle-Erweiterungen, besonders die setXXX() Methoden für die Bindung oracle.sql. types und Objekte in prepared statements. Also muss ich diese zu arbeiten. Ich werde zu aktualisieren, die ursprüngliche posting zu zeigen, ein Beispiel.
  • was ist das setup für jdbc/myPool? das sieht aus wie Sie nicht immer eine Oracle-Verbindung noch mit der Oracle-Treiber.
  • Ich bin mit den geeigneten oracle-Treiber, aber mit Tomcat, wie weiter oben verlinkt, ist konfiguriert für javax.sql.DataSource Wann es wahrscheinlich oracle.jdbc.pool.OracleDataSource. Ich habe versucht, zu übernehmen Maxx Antwort hier stackoverflow.com/questions/7484988/…, aber es ist einfach produziert null-Fehler für mich.
InformationsquelleAutor user46688 | 2017-05-15



2 Replies
  1. 4

    Dies ist, wie es funktioniert für mich in Tomcat:

    (a) Definieren Sie die Ressource in context.xml und platzieren Sie es unter die webapps//META-INF/context.xml

    <Context>
    <Resource name="jdbc/orcldriver_dbcs" auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.OracleDriver"
       username="hr"
       password="hr"
       url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))" 
    />
    </Context>

    (b) In der servlet, finden Sie in der resource, wie unten gezeigt.

    ctx = new InitialContext();
    Context envContext = (Context) ctx.lookup("java:/comp/env");
    
    //Look up a data source
    javax.sql.DataSource ds
              = (javax.sql.DataSource) envContext.lookup ("jdbc/orcldriver_dbcs");
    
    
    //With AutoCloseable, the connection is closed automatically.
          try (OracleConnection connection = (ds.getConnection()).unwrap(oracle.jdbc.OracleConnection.class)) 
    {
    
    ....
    doSQLWork();
    ....
    }
  2. 2

    Dies ist möglicherweise nicht die beste Antwort, aber durch Versuch und Irrtum, fand ich, dass ich nur eine Zeile code unten Auspacken der Anschluss an eine OracleConnection, und alles funktioniert einwandfrei.

    ...
    Connection tconn=null;
    OracleConnection conn=null;
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    DataSource ds = (DataSource) envCtx.lookup("jdbc/myPool");
    tconn = ds.getConnection();
    //the following line is needed to unwrap to OracleConnection
    conn= tconn.unwrap(OracleConnection.class);
    tconn.close();
    ...

    Ich bin sicher, es gibt eine alternative (vielleicht bessere) Möglichkeit zur Konfiguration von Tomcat für eine OracleConnection, aber ich bin mir nicht sicher, wie es zu tun.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.