当前位置: 首页 > 工具软件 > sshtunnel > 使用案例 >

python 使用sshtunnel 连接mysql报错 ERROR | Could not connect to gateway

邬楚青
2023-12-01

长连接:长连接是相对于短连接来说的。长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。mysql的长连接如果长期闲置,mysql会8小时后(默认时间)主动断开该连接。

短连接:是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。

超过默认连接时间,导致连接断开,所以可以隔段时间访问一次服务端,告诉服务端我还活着,不要断开连接。

from sshtunnel import SSHTunnelForwarder

import pymysql

class Link_Mysql():

    def __init__(self):

        self.server = SSHTunnelForwarder(ssh_address_or_host=(服务器host ,port),
                                    ssh_username='root',
                                    ssh_password='password', #和下方密码相同
                                    remote_bind_address=(数据库host, 数据库port)
                                    )
        self.server.start()

        #此处host为127.0.0.1
        self.conn = pymysql.connect(host="127.0.0.1", port=self.server.local_bind_port, user="root", passwd="password",
                     db="database")
        self.cursor = self.conn.cursor()

    def search_all(self, sql):
        self.conn.ping(reconnect=True)
        self.cursor.execute(sql)
        datas = self.cursor.fetchall()
        return datas

    def colse_link(self):
        self.server.close()

    def server_restart(self):
        while True:
            try:
                self.server.check_tunnels()
                self.server._check_is_started()#检查服务是否开启,未开启会抛出错误
                break
            except Exception as e:
                print('server_restart::',e)
                self.server.restart()
                self.conn = pymysql.connect(host="127.0.0.1", port=self.server.local_bind_port, user="root", passwd="password",
                          db="database")
                self.cursor= self.conn.cursor()

    def handle_data(self):

         sql=''

         result = self.search_all(sql)

         self.server_restart()

 类似资料: