C3P0 进阶:原生连接(Raw Connetion)和Statement操作

JDBC驱动在实现Connection和Statement上有时定义了一些与特定厂商的,不标准的API。c3p0将这些对象包装进了一个代理里,所以你不能把c3p0返回的Connection或Statement转换成特定厂商的实现。c3p0没有提供任何能够直接访问原生连接和Statement的方法,这是因为c3p0需要一直按顺序地追踪Statement和结果集的创建,来防止资源紧缺和池讹误(pool corruption)现象。

c3p0的确提供了一个能让你通过反射在底层的连接上来执行非标准方法的API。

使用方法是,首先将返回的Connection转换成一个C3P0ProxyConnection。然后调用rawConnectionOperation方法,然后提供一个你想要执行的java.lang.reflect.Method对象作为这个非标准方法的参数。你提供的这个Method对象将会在第二个参数(null或者静态方法)上执行,并且使用你提供的第三个参数来完成这个方法。对目标对象和这个方法的所有参数来讲,你都可以使用C3P0ProxyConnection.RAW_CONNECTION这个特殊的标记,它将会在Method执行前替代底层的特定厂商的Connection。

C3P0ProxyStatement也提供了类似的API。

原生操作返回的所有Statement(包括Prepared和CallableStatement)和ResultSet都是被c3p0所管理的,所以在其父代理连接上调用close() 方法的时候它们都会被正确地清理。用户必须注意清理那些与特定厂商相关的方法返回的那些非标准的资源。

这里有一个使用Oracle特定的API在原生连接上调用静态方法的例子:C3P0ProxyConnection castCon = (C3P0ProxyConnection) c3p0DataSource.getConnection(); Method m = CLOB.class.getMethod("createTemporary", new Class[] { Connection.class, boolean.class, int.class }); Object[] args = new Object[] { C3P0ProxyConnection.RAW_CONNECTION, Boolean.valueOf(true), new Integer(10) }; CLOB oracleCLOB = (CLOB) castCon.rawConnectionOperation(m, null, args);注意: C3P0现在支持了一些Oracle特定的方法了。

REF:
http://cwiki.ossez.com/pages/viewpage.action?pageId=4719799