gpt4 book ai didi

java - 从 SessionFactoryImpl 解包 Jdbc4Connection

转载 作者:行者123 更新时间:2023-11-29 12:45:14 26 4
gpt4 key购买 nike

我想将来自 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

我确信必须有更简单的方法来从 session 工厂解包 JDBC4 连接。

最佳答案

不幸的是,由于 DataSource 被代理了 3 次,要获得连接和 Postgres Jdbc4Connection 的真正实现,您需要深入了解 DataSource 代理,或者连接代理。不过,我会使用更惯用的 Groovy,并跳过使用“当前” session 工厂,因为 sessionFactory 代理会将所有调用传递给真实实例(另外我很确定这会在 WAR 中失败文件,因为这仅在开发中处于 Activity 状态以支持重新加载):

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

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

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 进行依赖注入(inject)),因为其中一个数据源代理是 TransactionAwareDataSourceProxy :

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

关于java - 从 SessionFactoryImpl 解包 Jdbc4Connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27024765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com