IT한 것/Vert.X

SQLClient 사용시 oracle prepared statement 오류

lovian 2021. 3. 17. 14:08
java.sql.SQLException: 지원되지 않는 기능입니다: getMetaData
        at oracle.jdbc.driver.ArrayDataResultSet.getMetaData(ArrayDataResultSet.java:1029) ~[ojdbc8.jar:12.2.0.1.0]
        at com.mchange.v2.c3p0.impl.NewProxyResultSet.getMetaData(NewProxyResultSet.java:987) ~[c3p0-0.9.5.4.jar:0.9.5.4]
        at io.vertx.jdbcclient.impl.actions.JDBCQueryAction.decodeReturnedKeys(JDBCQueryAction.java:182) [vertx-jdbc-client-4.0.2.jar:4.0.2]
        at io.vertx.jdbcclient.impl.actions.JDBCQueryAction.decode(JDBCQueryAction.java:59) [vertx-jdbc-client-4.0.2.jar:4.0.2]
        at io.vertx.jdbcclient.impl.actions.JDBCPreparedQuery.execute(JDBCPreparedQuery.java:69) [vertx-jdbc-client-4.0.2.jar:4.0.2]
        at io.vertx.jdbcclient.impl.actions.JDBCPreparedQuery.execute(JDBCPreparedQuery.java:39) [vertx-jdbc-client-4.0.2.jar:4.0.2]
        at io.vertx.ext.jdbc.impl.JDBCConnectionImpl.lambda$schedule$3(JDBCConnectionImpl.java:217) [vertx-jdbc-client-4.0.2.jar:4.0.2]
        at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:179) ~[vertx-core-4.0.2.jar:4.0.2]
        at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:96) ~[vertx-core-4.0.2.jar:4.0.2]
        at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:177) ~[vertx-core-4.0.2.jar:4.0.2]
        at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76) ~[vertx-core-4.0.2.jar:4.0.2]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_172]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_172]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_172]

 

DB의 성능을 위해서 prepared statement를 사용하는 것을 일반적인 이야기이다.

vert.x에 내장된 SQLClient 또한 prepared를 지원하기 때문에 사용을 해봤으나, 문제가 발생했다.

INSERT, UPDATE, REMOVE 쿼리는 잘 동작했으나, SELECT 쿼리를 이용하면 위와 같은 문제가 발생하는 것을 확인하였다.

 

혹시나 싶어 oracle jdbc driver를 버전을 12.0.1, 12.0.2, 18.x, 21.1 로 시도해봤는데, 모두 동일한 증상이다.

ojdbc.jar 파일을 열어 오류가 발생하는 부분을 확인하면 아래처럼 되어 있다

 

ResultSet에서 getMetaData를 지원하지 않도록 구현되어 있는 것으로 해석된다.

vert.x는 getMetaData를 이용하여 구현된 것 같으므로, vert.x의 SQLClient를 이용한 PreparedStatement는 oracld db에서 사용 불가능한 것으로 판단된다.