专栏首页HUC思梦的java专栏整合Atomikos、Quartz、Postgresql的踩坑日记

整合Atomikos、Quartz、Postgresql的踩坑日记

前言

由于业务需要,在单体Spring Boot项目中需要引入分布式事务,来保证单体应用连接的多个数据源的事务统一。

而说到分布式事务,小伙伴们肯定会想到阿里的Seata,阿里Seata强大的AT模式确实是解决分布式事务的一剂良药,

但是熟悉Seata的小伙伴肯定知道,使用Seata需要单独搭建Seata服务端来支持分布式事务,而对于一个单体应用项目有必要专门搭建这套服务端吗?

这是一个值得考虑的问题。王子认为技术选型的一个标准就是,用尽可能简单的方式解决复杂的问题。

于是,Atomikos出现了。至于什么是Atomikos这里就不介绍了,网上资料一大堆。本文主要是介绍引入Atomikos后出现的一些问题和解决方案。

引入Atomikos后的第一个坑

好了,下面我们进入正题,看看王子是如何引入Atomikos的。

说明:以下内容不是引入Atomikos的所有工作,王子只是做了个简单介绍,如果需要完整引入还需要参考其他文章。

要使用Atomikos当然要先在Maven中引入它的依赖了,它的依赖如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        </dependency>

这里我们省略一些必要的配置内容,

在配置数据源的过程中一定会有类似下边这部分的代码,用来配置Atomikos:

        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");
        ds.setUniqueResourceName(dataSourceName);
        ds.setMinPoolSize(5);
        ds.setMaxPoolSize(20);
        ds.setBorrowConnectionTimeout(60);
        ds.setXaProperties(prop);

第一个坑来了,在配置这部分内容中,王子开始时是没有配置下边这部分内容的。

        ds.setMinPoolSize(5);
        ds.setMaxPoolSize(20);
        ds.setBorrowConnectionTimeout(60);

这个时候,运行程序一切正常,包括它的分布式事务,王子也已经测试通过了。

但是,当运行应用中Quartz定时任务的时候,悲剧发生了,控制台直接报如下异常:

[ERROR][-- ::,][org.hibernate.engine.jdbc.spi.SqlExceptionHelper]Connection pool exhausted - try increasing 'maxPoolSize' and/or 'borrowConnectionTimeout' on the DataSourceBean.
[ERROR][-- ::,][org.apache.struts2.dispatcher.Dispatcher]Exception occurred during processing request: Could not open connection

现在对于这个第一个坑的解决方案相信大家已经清楚了,就是要配置刚才我们提到的那三行内容。

第二个坑

现在我们成功的解决了第一个坑,重启程序再次测试Quartz定时任务,看到应用中那还是一直在转的圈圈(头痛)。

经过对报错日志的分析之后,发现了一行有用的信息,如下:

Caused by: org.postgresql.util.PSQLException: ERROR: prepared transactions are disabled
  Suggerimento: Set max_prepared_transactions to a nonzero value.

看到这里其实就很明显了,翻译过来就是给max_prepared_transactions这个参数设置一个非0的值。

解决方案就是找到Postgresql数据库的postgresql.conf文件,修改这个值即可。

max_prepared_transactions默认是0,我们把它改成与max_connections一样大就可以了。

总结

本文主要是记录一下日常工作中踩到的坑,防止再犯同样的问题。

对于第一个坑,属于Atomikos的配置问题,小伙伴们可以做一个了解。

对于第二个坑,王子这里使用的是Postgresql数据库,所以导致了这个问提,建议如果使用Postgre数据库都开启一下这个参数,防止后患。

最后王子说明一下,Atomikos只适用于类似本文中的这种小规模系统,它的底层是XA的2PC方案,会对数据库资源有一定的锁定过程,所以性能不是很高。

所以,对于要考虑高并发、高性能的系统,分布式事务框架还是要优先选择Seata。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot深入浅出系列(16章97节)

    本书为spring boot 深入浅出系列视频教程的文档。 spring boot 深入浅出系列课程(16章97节)

    字母哥博客
  • 54 个官方 Spring Boot Starers 出炉!别再重复造轮子了……

    在之前的文章,栈长介绍了 Spring Boot Starters,不清楚的可以点击链接进去看下。

    Java技术栈
  • Laravel5.8+LayUI踩坑之路

    今天在整理博客笔记时发现,自己对于现在所学的Laravel5.8与LayUI前端框架学习的笔记已经多达近20篇,其中包括了对Laravel5.8的理解、配置环境...

    Meng小羽
  • 构建自己的地理信息空间数据库及与客户端简单交互

    最近研究了下postgresql数据库及其空间地理信息拓展插件——postgis。

    数据小磨坊
  • Spring Boot集成Quartz-动态任务管理

    当定时任务越来越多时,集中管理Job越有必要。Quartz提供了一组丰富的API,来管理Job。

    用户2146693
  • 复工潮来临,Java 人跳槽要注意哪些?

    “心累,期盼、担忧又无奈。” 一位朋友在后台留言道。具体问了下情况,是一位 5 年工作经验的朋友,代码功底扎实,项目经验挺丰富。本打算年后跳槽,谋得一份架构师的...

    Java技术栈
  • Quartz-任务调度信息持久化到DB中

    在默认情况下,Quartz将任务调度的运行信息保存在内存中。 这种方法提供了最佳的性能,因为在内存中的数据访问速度最快;不足之处就是却反数据的持久性,当程序中...

    小小工匠
  • MYSQL VS PostgreSQL 外国佬怎么选--那个更好?

    MYSQL vs PostgreSQL 的话题应该属于经久不衰的话题,类似 REDIS VS MONGODB (我比较奇怪这两个是怎么被强拉硬拽到一起的)。作为...

    AustinDatabases
  • 如何实现update select 语句

    有些时候我们会遇到如下情况,我们需要依赖一张表的查询结果来更新另一张表,比如我们存在一张主表和一张关联表,我们需要把关联表的部分字段数据同步到主表的里面。

    阿东
  • 企业版Tapdata

    如果公司使用有一个多版本的项目,由于特殊需求,数据库必须放在他们本地,但是公司又需要汇总整个的数据做数据分析,这样就要实时更新每一服务器上的数据库来保证他们的数...

    微醺
  • 手把手教你安装 azkaban 运行环境

    最近项目上需要搭建一个任务调用框架,在对比了市面上一些常用的调度框架比如「Quartz」,「Elastic Job」,「xxl-job」 以及 「azbakan...

    Java技术编程
  • 手把手教你安装 azkaban 运行环境

    最近项目上需要搭建一个任务调用框架,在对比了市面上一些常用的调度框架比如「Quartz」,「Elastic Job」,「xxl-job」 以及 「azbakan...

    Java技术编程
  • 邀您参会 | Gdevops全球敏捷运维峰会-广州站

    今年国产数据库在国际舞台上大放异彩相信大家都有目共睹,更多国产数据库加入到数据库市场的队列,对于企业来说也就有了更多的选择。根据2019 DeveloperW...

    腾讯云数据库 TencentDB
  • 【码云周刊第 11 期】追踪代码大仓库? Git 的拿手好戏!

    每周为您推送最有价值的开源技术内参! 一周热门资讯回顾 ActFramework 1.0 正式发布, Java MVC 框架 TIOBE 3 月编程语言排行榜...

    码云Gitee
  • 分布式任务调度的解决方案

    随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务系统,每个业务系统都有定时任务的需求,如果都在自身系...

    慕容千语
  • Spring Boot 2.x基础教程:使用JTA实现分布式事务

    在一个Spring Boot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见:

    程序猿DD
  • Postgresql vacuum最佳实践

    Postgresql作为世界上最先进的HTAP数据库,以其超高在线事务处理及分析性能和强大的功能被广泛应用与各行各业中。但其实它也并不完美,说到postgres...

    数据库架构之美
  • 盘点 2020 | 我要为分布式数据库 MongoDB 在国内影响力提升及推广做点事

    MongoDB是一款功能完善的分布式文档数据库,在高性能、动态扩缩容、高可用、易部署、易使用、海量数据存储等方面拥有天然优势。虽然MongoDB有很多优势,但是...

    MongoDB中文社区
  • Quartz.Net使用教程

    在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知、后台处理耗时的数据处理等,这个时候你就需要Quartz.Net了。

    Edison.Ma

扫码关注云+社区

领取腾讯云代金券