java - ojdbc8 - oracle jdbc maven
¿Por qué obtengo java.lang.AbstractMethodError cuando intento cargar un blob en el db? (14)
Tengo un problema con JDBC.
Tengo el siguiente código:
//blargeparam is a blob column.
PreparedStatement pst =connection.prepareStatement("update gcp_processparams_log set blargeparam= ? where idprocessparamslog=1");
pst.setBinaryStream(1,inputStream);
Obtuve el siguiente error:
Exception in thread "main" java.lang.AbstractMethodError:
oracle.jdbc.driver.T2CPreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
Mi cadena de conexión es jdbc:oracle:oci:@.....
La versión de Oracle es 11g.
Del mensaje de error parece que falta algo pero:
- cuando leo de la misma columna blob (con blob.getBytes) todo funciona.
- Las DLL del cliente instantáneo están (correctamente) en la ruta de la biblioteca.
Este es el manifiesto de Oracle JDBC JAR en mi ruta de clase:
Manifest-Version: 1.0 Specification-Title: Oracle JDBC driver classes for use with JDK14 Sealed: true Created-By: 1.4.2_14 (Sun Microsystems Inc.) Implementation-Title: ojdbc14.jar Specification-Vendor: Oracle Corporation Specification-Version: Oracle JDBC Driver version - "10.2.0.4.0" Implementation-Version: Oracle JDBC Driver version - "10.2.0.4.0" Implementation-Vendor: Oracle Corporation Implementation-Time: Sat Feb 2 11:40:29 2008
Como se describe en la API de java.sql.PreparedStatement.setBinaryStream()
, está disponible desde 1.6, por lo que es una API de JDBC 4.0 . Utiliza un controlador JDBC 3 por lo que este método no está disponible.
Con JDBC, ese error generalmente ocurre porque su controlador JDBC implementa una versión anterior de la API de JDBC que la que se incluye en su JRE. Estas versiones anteriores están bien siempre y cuando no intentes usar un método que apareció en la API más nueva.
No estoy seguro de qué versión de JDBC setBinaryStream
apareció. Ha existido por un tiempo, creo.
De todos modos, su versión de controlador JDBC (10.2.0.4.0) es bastante antigua, le recomiendo actualizarla a la versión que se lanzó con 11g (descargue here ) y vuelva a intentarlo.
Creo que el motivo del error del controlador JDBC es que debe obtener el controlador JDBC adecuado para su Oracle db. Puedes obtenerlo de
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
El problema se debe a la versión anterior de ojdbc - ojdbc14.
Coloque la última versión del archivo jar ojdbc en su aplicación o biblioteca compartida. (Solo una versión debería estar allí y debería ser la última) A partir de hoy - ojdbc6.jar
Verifique las bibliotecas de aplicaciones y las bibliotecas compartidas en el servidor.
En mi caso el problema fue en el archivo context.xml de mi proyecto.
Lo siguiente de context.xml causa el java.lang.AbstractMethodError , ya que no mostramos la fábrica de la fuente de datos.
<Resource name="jdbc/myoracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@(DESCRIPTION = ... "
username="****" password="****" maxActive="10" maxIdle="1"
maxWait="-1" removeAbandoned="true"/>
Simpy agregando factory = "org.apache.tomcat.jdbc.pool.DataSourceFactory" resolvió el problema:
<Resource name="jdbc/myoracle"
auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@(DESCRIPTION = ... "
username="****" password="****" maxActive="10" maxIdle="1"
maxWait="-1" removeAbandoned="true"/>
Para asegurarme de haber reproducido el problema varias veces eliminando fábrica = "org.apache.tomcat.jdbc.pool.DataSourceFactory" del Recurso
En mi caso, este fue el error.
Excepción en el hilo "principal" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid (I) Z en org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid (DelegatingConnection.java:917) en org.apache .tomcat.dbcp.dbcp2.PoolableConnection.validate (PoolableConnection.java:282) en org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection (PoolableConnectionFactory.java:356) en org.apache.tomcat.dbcp.dbcp2.BasicDataSource .validateConnectionFactory (BasicDataSource.java:2306) en org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory (BasicDataSource.java:2289) en org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource (BasicDataSource.java:2038 ) en org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection (BasicDataSource.java:1532) en beans.Test.main (Test.java:24)
Solución: simplemente cambio ojdbc14.jar
a ojdbc6.jar
Encuentro este problema use ojdbc14.jar y jdk 1.6
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,file.length()); // got AbstractMethodError
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,(int)file.length()); // no problem.
Esto es lo que dice la API de JDK sobre AbstractMethodError:
Lanzado cuando una aplicación intenta llamar a un método abstracto. Normalmente, este error es capturado por el compilador; este error solo puede ocurrir en tiempo de ejecución si la definición de alguna clase ha cambiado de forma incompatible desde la última compilación del método que se está ejecutando actualmente.
¿Error en el controlador del oráculo, tal vez?
Parece que incluso si el controlador 10.2 es compatible con el JDBC3 puede que no funcione con JRE6 como he encontrado aquí:
¿Qué controladores JDBC admiten qué versiones de JDK de Javasoft?
controladores pre-8i OCI y THIN - JDK 1.0.x y JDK 1.1.x
8.1.5 Controladores OCI y THIN - JDK 1.0.x y JDK 1.1.x
Controlador 8.1.6SDK THIN - JDK 1.1.x y JDK 1.2.x (también conocido como Java2)
Controlador 8.1.6SDK OCI: solo JDK 1.1.x
8.1.6 Controlador OCI y THIN - JDK 1.1.x y JDK 1.2.x
8.1.7 Controlador OCI y THIN - JDK 1.1.x y JDK 1.2.x
9.0.1 Controlador OCI y THIN - JDK 1.1.x, JDK 1.2.x y JDK 1.3.x
9.2.0 Controlador OCI y THIN - JDK 1.1.x, JDK 1.2.x, JDK 1.3.x y JDK 1.4.x
10.1.0 Controlador OCI y THIN - JDK 1.2.x, JDK 1.3.x y JDK 1.4.x
10.2.0 Controlador OCI y THIN - JDK 1.2.x, JDK 1.3.x, JDK 1.4.x y JDK 5.0.x
11.1.0 Controlador OCI y THIN - JDK 1.5.x y JDK 1.6.x
Oracle 10.2.0 es compatible con:
Soporte completo para JDBC 3.0
Tenga en cuenta que no hay un cambio real en el soporte para lo siguiente en la base de datos. Todo lo que ha cambiado es que algunos métodos que anteriormente lanzaban SQLException ahora hacen algo más razonable.
conjunto de resultados de holgura
devolver múltiples conjuntos de resultados.
Simplemente ponga ojdbc6.jar
en la ruta de clases, para que podamos corregir la excepción CallbaleStatement
:
oracle.jdbc.driver.T4CPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V)
en Oracle
Simplemente use ojdb6.jar y solucionará todos estos problemas.
Para aplicaciones basadas en maven:
Descargue y copie ojdbc6.jar en un directorio en su máquina local
Desde la ubicación donde ha copiado su jar, instale el archivo ojdbc6.jar en su Repo local .M2 emitiendo el siguiente comando C: / SRK / Softwares / Libraries> mvn install: install-file -DgroupId = com.oracle -DartifactId = ojdbc6 - Dversion = 11.2.0.3 -Dpackaging = jar -Dfile = ojdbc6.jar -DgeneratePom = true
Agregue lo siguiente en su proyecto pom.xml como dependencia de ojdbc6.jar
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency>
PD: El problema puede deberse a los usos de la anotación @Lob en JPA para almacenar objetos grandes específicamente en columnas Oracle db. La actualización a 11.2.0.3 (ojdbc6.jar) puede resolver el problema.
Sugiero que investigue su classpath con mucho cuidado. Puede tener dos versiones diferentes de un archivo jar donde uno invoca métodos en el otro y el otro método es abstracto.
Tengo el mismo problema y lo resolví.
Para resolver este problema, debe actualizar commons-dbcp library a la última versión (1.4). Funcionará con los últimos controladores JDBC.
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,file.length());
en lugar de esto, necesitas usar
InputStream in = new FileInputStream(file);
cstmt.setBinaryStream(1, in,(int)file.length());