深度解析数据库连接The last packet successfully received from the server was *xxx* milliseconds ago

9 篇文章 0 订阅
4 篇文章 0 订阅

相信很多人都遇到过这个问题,看到提示信息,或许大家都明白这不就是获取到的数据库连接超时了嘛,没错,问题的本质也的确如此,常见的解决办法也很简单,比如说从数据库连接池中获取连接的时候判断下连接状态是否正常,这样就可以避免此类问题的发生,如果都是此问题,那么就不会再有本文来赘述问题和解决方案,下面一起来看看造成该问题的几个原因和解决方法。

1.从连接池获取到超时的连接

从数据库连接池获取到超时的连接,目前这种情况大多数数据库连接池中间件都有相应的处理策略,一种是定期扫描连接池中的连接,探测到失效连接后剔除功能,这样可以保证连接池中连接的有效性。另一种则是从连接池中获取连接的时候再判断连接的有效性。这两种策略在连接池中间件中都是可配置的,只要配置好相关参数,这类问题基本可以消除。

2.连接池连接最大存活时长超过数据库配置

这个引起问题的情况不多,不过也不容易忽视,如果连接池中的连接时长超过数据库的配置,那么就会出现数据库已经关闭了该连接,但连接池中依然有效,业务获取到该连接后进行数据库操作,必然会出错。如果开启了从连接池获取连接时有效性校验,这个问题基本可以规避,不过此时性能会有所损耗,所以还是从配置上解决该问题较为合理。

3.长事务导致的超时

这类问题是相对比较少见的,但也不是不可能,我们知道,在Java应用中,进入事务方法后,就会获得一个数据库连接,此时获得的连接是经过检查的,所以当前状态是可用的,一旦在事务方法中做了比较耗时的操作,在超时时间内没有处理完,这个时候,这个连接已经被数据库关闭了,最后当业务执行数据库操作时就会收到一个标题的错误消息。

总结

第1、2类问题比较常见,而且目前都已有成熟的解决方案,但第三类属于编码层面的问题。而且长事务导致的这类问题比较隐晦,也比较难排查,因为大多数情况下不会出现,而且如果涉及到网络操作的,依赖于网络环境,时好时坏,就更难排查了。另外数据库连接是昂贵的资源,长时间占有会严重影响服务性能,而且还会引起其他线程获取连接超时的问题,所以,对于事务问题,时间要尽可能的短,才能让数据库连接发挥应有的作用。此类问题就是笔者维护的项目前人无意留下的“彩蛋”。

2023-05-02更

长事务导致连接超时的解决方案

对于长事务导致的连接超时问题有一种解决方案,就是区分“领域服务”和“业务服务”,将事务放置在领域服务层,领域服务层只处理当前领域逻辑和DB的逻辑,这样可以将一些IO操作放置在业务服务层处理,不会对领域服务层造成长事务的影响。以下是个人理解的“领域服务”和“业务服务”。

领域服务

领域服务和持久层一一对应,负责处理持久层需要的相关逻辑。

业务服务

可以聚合多个领域服务,处理跨领域服务的相关逻辑,同时可以支持跨领域服务的事务,保障数据的一致性。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将提取的招聘信息保存到 MySQL 数据库中,你可以使用 Python 的 `mysql-connector-python` 库来连接和操作数据库。以下是修改后的代码示例,可以爬取前述关键词列表的第一页招聘信息,并将提取的信息保存到 MySQL 数据库中,并从数据库中查询并展示数据在控制台上: ```python import requests from bs4 import BeautifulSoup import mysql.connector keywords = ['数据分析', '数据挖掘', '算法', '机器学习', '深度学习', '人工智能'] def scrape_job_details(url, cursor): response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 提取招聘信息详情页的相关信息 job_title = soup.find('h1').text.strip() job_description = soup.find('div', class_='job-detail').text.strip() # 其他信息的提取类似... # 插入到数据库 sql = "INSERT INTO jobs (job_title, job_description, ...) VALUES (%s, %s, ...)" values = (job_title, job_description, ...) cursor.execute(sql, values) def scrape_jobs(): base_url = 'https://example.com/jobs?keyword=' # 连接到 MySQL 数据库 cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database') cursor = cnx.cursor() # 创建 jobs 表(如果不存在的话) create_table_query = """ CREATE TABLE IF NOT EXISTS jobs ( id INT AUTO_INCREMENT PRIMARY KEY, job_title VARCHAR(255), job_description TEXT, ... ) """ cursor.execute(create_table_query) for keyword in keywords: url = base_url + keyword response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') job_links = soup.find_all('a', class_='job-link')[:10] # 只获取前10个招聘信息的链接 for link in job_links: job_url = link['href'] job_url = 'https://example.com' + job_url # 拼接完整的招聘信息详情页链接 scrape_job_details(job_url, cursor) cnx.commit() # 提交数据库事务 # 从数据库中查询并展示数据 select_query = "SELECT * FROM jobs" cursor.execute(select_query) result = cursor.fetchall() for row in result: print('招聘名称:', row[1]) print('职位信息:', row[2]) # 其他信息的输出类似... print('------------------------------') # 关闭数据库连接 cursor.close() cnx.close() scrape_jobs() ``` 请注意,你需要根据实际情况修改数据库连接配置(`your_username`、`your_password`、`your_host`、`your_database`),以及调整表的结构和列名(`jobs` 表)。此外,你还需要根据目标网站的 HTML 结构和相应的解析规则进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值