[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1737) Add a ConnectionWrapper interface to allow access to the underlying connection from a BorrowedConnectionProxy
Steve Ebersole (JIRA)
noreply at atlassian.com
Mon Dec 4 08:21:04 EST 2006
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1737?page=comments#action_25546 ]
Steve Ebersole commented on HHH-1737:
-------------------------------------
Of course its "working" when using C3P0; at least this is the same behavior Hibernate always exhibited here. The wrapped connection, from Hibernate's perspective, is the C3P0 wrapped connection (C3P0 defines this NewProxyConnection, not HIbernate).
> Add a ConnectionWrapper interface to allow access to the underlying connection from a BorrowedConnectionProxy
> -------------------------------------------------------------------------------------------------------------
>
> Key: HHH-1737
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1737
> Project: Hibernate3
> Type: Bug
> Components: core
> Versions: 3.1.1, 3.1.2, 3.1.3
> Environment: Hibernate 3.1.3, Oracle 9.2.0.4
> Reporter: Nick Reid
> Assignee: Steve Ebersole
> Fix For: 3.2.1
>
>
> The borrowConnection functionality now prevents us from accessing the native connection to perform necessary operations (LOB handling, OAQ integration). Instead of just returning a simple proxy the implements java.sql.Connection the proxy could additionally implement an interface that allows users to access the wrapped connection returned by the ConnectionManager.
> i.e.
> public interface BorrowedConnection extends java.sql.Connection
> {
> java.sql.Connection getTargetConnection()
> }
> public class BorrowedConnectionProxy implements InvocationHandler {
> private final ConnectionManager connectionManager;
> private boolean useable = true;
> public BorrowedConnectionProxy(ConnectionManager connectionManager) {
> this.connectionManager = connectionManager;
> }
> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
> if ( "close".equals( method.getName() ) ) {
> connectionManager.releaseBorrowedConnection();
> return null;
> }
> if ( "getTargetConnection".equals( method.getName() ) ) {
> return connectionManager.getConnection();
> }
> // should probably no-op commit/rollback here, at least in JTA scenarios
> if ( !useable ) {
> throw new HibernateException( "connnection proxy not usable after transaction completion" );
> }
> try {
> return method.invoke( connectionManager.getConnection(), args );
> }
> catch( InvocationTargetException e ) {
> throw e.getTargetException();
> }
> }
> public static Connection generateProxy(ConnectionManager connectionManager) {
> BorrowedConnectionProxy handler = new BorrowedConnectionProxy( connectionManager );
> return ( Connection ) Proxy.newProxyInstance(
> Connection.class.getClassLoader(),
> new Class[] { BorrowedConnection.class },
> handler
> );
> }
> public static void renderUnuseable(Connection connection) {
> if ( connection != null && Proxy.isProxyClass( connection.getClass() ) ) {
> InvocationHandler handler = Proxy.getInvocationHandler( connection );
> if ( BorrowedConnectionProxy.class.isAssignableFrom( handler.getClass() ) ) {
> ( ( BorrowedConnectionProxy ) handler ).useable = false;
> }
> }
> }
> }
> We could always get access to the connectionManager field of the invocation handler via reflection, but this is not supportable or maintainable.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list