Рабочее

Mar 02, 2010 12:39

При попытке воспользоваться oracle.sql.ARRAY для передачи массивов к серверу в приложении, использующем пул коннектов из commons-dbcp обычно нарываешься на
java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper ,
поскольку оракакелу нужон свой коннект к базе, а не враппер. Для обхода можно использовать следующую функцию:

public static Connection getUnderliedConnection(java.sql.Connection con) throws java.sql.SQLException {
if (con instanceof DelegatingConnection) {
Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
// For some reason, the innermost delegate can be null: not for a
// Statement's Connection but for the Connection handle returned by the pool.
// We'll fall back to the MetaData's Connection in this case, which is
// a native unwrapped Connection with Commons DBCP 1.1.
return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
}
return con;
}

Использование простое
java.sql.Connection con1=getUnderliedConnection(con);
потом использовать con1 во всех вызовах, где Ораклу (ну, или кому еще ) нужен свой коннект, а не враппер.
Функция поперта на каком-то китайском форуме.

дыбыр, рабочее

Previous post Next post
Up