繁体   English   中英

从SessionFactoryImpl中解开Jdbc4Connection

[英]Unwrapping Jdbc4Connection from SessionFactoryImpl

我想从postgres JDBC中使用CopyManager作为我的一个项目。 但是我在从Grails项目的sessionFactory获取此对象的实例时遇到问题。

这是我目前的做法:

SessionFactoryImpl sessionFactoryImpl = (sessionFactory.currentSessionFactory as SessionFactoryImpl)
LazyConnectionDataSourceProxy lcdsProxy = java.lang.reflect.Proxy.getInvocationHandler(sessionFactoryImpl.connectionProvider.connection).targetDataSource
DisposableConnectionFacade dcFacade = java.lang.reflect.Proxy.getInvocationHandler(lcdsProxy.targetDataSource.connection)
Jdbc4Connection jdbc4Connection = dcFacade.next.connection.connection
CopyManager cm = (jdbc4Connection as BaseConnection).copyAPI

我敢肯定,如何从会话工厂解包JDBC4连接必须有更简单的方法。

不幸的是,由于DataSource被代理了3次,为了获得连接和Postgres Jdbc4Connection的真正实现,您需要深入了解DataSource代理或连接代理。 我会使用更多惯用的Groovy并跳过使用'current'会话工厂,因为sessionFactory代理会将所有调用传递给真实实例(而且我很确定在WAR文件中会失败,因为它只在dev支持重新加载):

import java.lang.reflect.Proxy

def lcdsProxy = Proxy.getInvocationHandler(sessionFactory.connectionProvider.connection).targetDataSource
def dcFacade = Proxy.getInvocationHandler(lcdsProxy.targetDataSource.connection)
def jdbc4Connection = dcFacade.next.connection.connection
CopyManager cm = jdbc4Connection.copyAPI

我的偏好是从当前会话而不是当前会话工厂获取连接,因为这是保持连接的东西,并且这3个代理之一是org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy以确保正在使用的连接当前会话将作为“新”连接从DataSource返回。 所以有一种方法

def connection = sessionFactory.currentSession.connection()
def jdbc4Connection = connection.targetConnection.targetConnection.connection
CopyManager cm = jdbc4Connection.copyAPI

或者如果这是您需要sessionFactory的唯一原因,您可以使用withSession

AnyDomainClass.withSession { session ->
   def connection = session.connection()
   def jdbc4Connection = connection.targetConnection.targetConnection.connection
   CopyManager cm = jdbc4Connection.copyAPI
}

或者甚至跳过它并转到DataSource (使用def dataSource注入依赖关系),因为其中一个数据源代理是TransactionAwareDataSourceProxy

def connection = ctx.dataSource.connection
def jdbc4Connection = connection.targetConnection.targetConnection.connection
CopyManager cm = jdbc4Connection.copyAPI

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM