Java Spring数据JPA通过ssh隧道连接到远程MySQL服务器

Java Spring数据JPA通过ssh隧道连接到远程MySQL服务器,java,hibernate,ssh,spring-data,jsch,Java,Hibernate,Ssh,Spring Data,Jsch,我正在使用SpringDataJPA和Hibernate作为持久性提供者,并与远程MySQL5服务器一起执行定期复制内部数据子集的作业。作业(即quartz计划的java应用程序)每dai运行一次,需要大约30秒来完成同步)。出于安全原因,我们不希望打开远程服务器进行外部直接连接(即本地主机以外的连接) 我已经看到了Jsch以编程方式设置ssh隧道的示例,但是没有找到任何关于如何将Jsch与spring数据集成的资源。我看到的一个问题是,我的某些Springbean(即org.apache.co

我正在使用SpringDataJPA和Hibernate作为持久性提供者,并与远程MySQL5服务器一起执行定期复制内部数据子集的作业。作业(即quartz计划的java应用程序)每dai运行一次,需要大约30秒来完成同步)。出于安全原因,我们不希望打开远程服务器进行外部直接连接(即本地主机以外的连接)

我已经看到了Jsch以编程方式设置ssh隧道的示例,但是没有找到任何关于如何将Jsch与spring数据集成的资源。我看到的一个问题是,我的某些Springbean(即org.apache.commons.configuration.DatabaseConfiguration)是在应用程序启动时创建的,并且已经需要访问数据源

我可以在应用程序之外打开ssh隧道,但它会一直打开,但我想避免这种情况,因为我每天只需要打开30秒

编辑:

经过一些研究,我找到了几种获得ssh隧道的方法

A) 实现我自己的数据源(我扩展了org.springframework.jdbc.DataSource.driverManager数据源),然后使用postcontract和Predestroy使用Jsch设置/关闭ssh隧道

-->问题:ssh隧道在应用程序的生命周期内保持打开状态,这不是我想要的

B) 实现我自己的驱动程序(我扩展了com.mysql.jdbc.Driver)并覆盖“connect”以在连接之前创建ssh隧道

-->问题:我无法关闭ssh隧道连接


欢迎提供更多建议

如果您在Spring配置中有一个
数据源
bean,那么您可以创建自己的
数据源
实现,在尝试使用提供的JDBC URL建立连接之前打开SSH隧道。举个例子,考虑下面的配置:使用<代码> HIKARIDIDATASURCE < /代码>:

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource">
    <bean class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">...</bean>
  </property>
</bean>

然后,为定制类实例化一个bean实例,而不是
HikariDataSource

如果您在Spring配置中有一个
DataSource
bean,那么您可以创建自己的
DataSource
实现,在尝试使用提供的JDBC URL建立连接之前打开一个SSH隧道。举个例子,考虑下面的配置:使用<代码> HIKARIDIDATASURCE < /代码>:

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource">
    <bean class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">...</bean>
  </property>
</bean>

然后,为自定义类实例化一个bean实例,而不是
HikariDataSource

,谢谢你的提示,我不知道我可以预先实现我自己的数据源。由于目前我正在使用jndi datasoruce(org.springframework.jnd.JndiObjectFactoryBean),我仍然需要了解如何获取连接url/端口(我在Tomcat的上下文中定义)并将主机名和端口作为bean上的属性公开。除了
createTunnel
tunnelPort
之外,您还可以拥有
remoteHost
remotePort
。我如何获得关闭连接的句柄(关闭ssh隧道?)。据我所知,这是在连接对象本身中实现的(在我的例子中,是一个实现java.sql.Connectio的类?为什么要在每个连接请求上打开和关闭隧道?建立隧道是一项昂贵的操作,因此它会降低您的操作速度。如果确实要在每个连接上打开和关闭隧道,您必须实现自己的
连接
类si。)因为你在玩连接生命周期。另外,请分别问不同的问题。谢谢你的提示,我不知道我可以避免我自己的数据源实现。因为我现在使用的是jndi datasoruce(org.springframework.jnd.JndiObjectFactoryBean),所以我仍然需要找到如何获取连接url/端口(我在Tomcat的上下文中定义)也将主机名和端口作为bean上的属性公开。除了
createTunnel
tunnelPort
,您还可以使用
remoteHost
remotePort
。我如何获得关闭连接的句柄(关闭ssh隧道?).据我所知,这是在连接对象本身中实现的(在我的例子中,是一个实现java.sql.Connectio的类?为什么要在每个连接请求上打开和关闭隧道?建立隧道是一项昂贵的操作,因此它会降低您的操作速度。如果确实要在每个连接上打开和关闭隧道,您必须实现自己的
连接
类si。)您正在玩连接生命周期。另外,请分别提出不同的问题。