从SessionFactoryImpl中解开Jdbc4Connection

时间:2014-11-19 18:57:22

标签: java hibernate postgresql grails jdbc

我想从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连接的简单方法。

1 个答案:

答案 0 :(得分:3)

不幸的是,由于DataSource代理了3次,为了获得连接和Postgres Jdbc4Connection的真正实现,您需要深入了解DataSource代理或连接代理。我会使用更多惯用的Groovy并跳过使用'当前'会话工厂,因为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