当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA与ssh隧道连接到远程MySQL服务器

柴彬
2023-03-14

我将Spring Data JPA与Hibernate一起作为持久化提供程序,并将远程MySQL5服务器用于定期复制内部数据子集的作业。该作业(即Quartz调度的java应用程序)每个dai运行一次,大约需要。30秒完成同步)。出于安全原因,我们不想打开远程服务器进行外部直接连接(即。本地主机以外)。

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

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

编辑:

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

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

欢迎提出更多建议

共有1个答案

惠凯歌
2023-03-14

如果Spring配置中有DataSourcebean,则可以创建自己的DataSource实现,在尝试使用提供的JDBC URL建立连接之前打开SSH隧道。作为一个示例,考虑使用hikaridataSource的以下配置

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

您可以扩展类HikaridataSource以提供自己的实现。下面的一个例子:

class TunneledHikariDataSource extends HikariDataSource implements InitializingBean {
  private boolean createTunnel = true;
  private int tunnelPort = 3306;

  public void afterPropertiesSet() {
    if(createTunnel) {
      // 1. Extract remote host name from the JDBC URL.
      // 2. Extract/infer remote tunnel port (e.g. 3306)
      // from the JDBC URL.
      // 3. Create a tunnel using Jsch and sample code
      // at http://www.jcraft.com/jsch/examples/PortForwardingL.java.html
      ...
    }
  }
}

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

 类似资料:
  • 我正在我的机器上运行Ansible。我的机器没有ssh访问远程机器的权限。来自本地计算机的端口22连接被学院防火墙阻止。但是我可以访问一台机器(ssh隧道),通过它我可以登录到远程机器。现在有一种方法可以在远程主机上从本地机器运行ansible playbook。 在某种程度上,可以通过ssh隧道将Ansible/ssh连接到远程机器。但并不完全登录到ssh隧道。连接将通过隧道。 另一种方法是我可

  • 问题内容: 我已经在两个服务器 A 和 B 之间建立了SSH隧道。 B 有MySQL服务器,这可行: 虽然这不是: 尽管my.cnf具有以下几行: 现在关于隧道。它连接以下内容: 但是当(在 A上 ,端口转发)时,我会 我懂了 当我这样做 我懂了 可能是什么原因?我究竟做错了什么? 问题答案: 这里有三个问题。 1-暂时忘记SSH隧道 您不能将MySQL绑定到多个特定IP。第一个子句被第二个子句覆

  • 我试图使用spring-boot Application.properties连接到远程计算机上的MySQL server,但失败了,错误。

  • > 上的SSH主机 位于的MySQL主机 我已经设法使用autossh(运行Debian的web服务器)创建了隧道,但我似乎不知道如何连接到SSH隧道之外的特定MySQL主机名。 创建SSH隧道后,如何指定主机?我到处都找过了,但似乎找不到。

  • 问题内容: 我已经在不同的主机名上设置了约50个数据库,并要求我通过SSH隧道连接到它们。 例如: SSH主机位于 MySQL主机位于 我已经设法使用autossh(运行Debian的Web服务器)创建隧道,但是我似乎无法弄清楚如何连接到SSH隧道之外的特定MySQL主机名。 键入确认隧道正在运行(将端口3307发送到ssh.example.com端口3306) 所以当我尝试时,我会拒绝连接。不太

  • 我想通过ssh隧道与具有localhost访问权限的用户连接到远程MySQL。 我用这个做隧道: 和这个连接到主机: 我得到的错误是: 问题是用户“user”@“remote-host”(或“user”@“%”)不存在,只有“user”@“localhost”存在。 有没有办法强迫远程主机在不进行服务器端修改的情况下认为我来自本地主机?这是我通过ssh隧道进行连接的唯一原因。 注: 如果要连接此命