环境

  • spring-boot:1.5.9
  • druid:1.1.6
  • spring-boot-starter-jta-atomikos:1.5.9
  • mybatis-spring-boot-starter:1.3.1
  • MySQL:8.0.19
  • MySQL-Connector:8.0.19
  • MacOS:10.14.5

问题一、Property 'uniqueResourceName' cannot be null

Caused by: com.atomikos.jdbc.AtomikosSQLException: Property 'uniqueResourceName' cannot be null
	at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:46) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.throwAtomikosSQLException(AbstractDataSourceBean.java:90) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.throwAtomikosSQLException(AbstractDataSourceBean.java:85) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:286) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.getConnection(AbstractDataSourceBean.java:339) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.getConnection(AbstractDataSourceBean.java:394) ~[transactions-jdbc-3.9.3.jar:na]
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) ~[spring-jdbc-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) ~[spring-jdbc-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	... 62 common frames omitted

源码跟踪

image.png
通过跟踪源码可知,如果com.atomikos.jdbc.AbstractDataSourceBean#getUniqueResourceName == null,则会抛出AtomikosSQLException(Property 'uniqueResourceName' cannot be null)异常

解决方法

给AtomikosDataSourceBean设置一个UniqueResourceName即可,如下

atomikosDataSourceBean.setUniqueResourceName("activity-db");

问题二、XAConnectionFactory: failed to create pooled connection - DBMS down or unreachable?

c.a.jdbc.AtomikosXAConnectionFactory     : XAConnectionFactory: failed to create pooled connection - DBMS down or unreachable?

java.sql.SQLFeatureNotSupportedException: null
	at com.alibaba.druid.util.MySqlUtils.createXAConnection(MySqlUtils.java:179)
	at com.alibaba.druid.pool.xa.DruidXADataSource.createPhysicalXAConnection(DruidXADataSource.java:73)
	at com.alibaba.druid.pool.xa.DruidXADataSource.getXAConnection(DruidXADataSource.java:49)
	at com.atomikos.jdbc.AtomikosXAConnectionFactory.createPooledConnection(AtomikosXAConnectionFactory.java:43)
	at com.atomikos.datasource.pool.ConnectionPool.createPooledConnection(ConnectionPool.java:98)
	at com.atomikos.datasource.pool.ConnectionPool.growPool(ConnectionPool.java:205)
	at com.atomikos.datasource.pool.ConnectionPool.retrieveFirstAvailableConnectionAndGrowPoolIfNecessary(ConnectionPool.java:155)
	at com.atomikos.datasource.pool.ConnectionPool.findOrWaitForAnAvailableConnection(ConnectionPool.java:141)
	at com.atomikos.datasource.pool.ConnectionPool.borrowConnection(ConnectionPool.java:132)
	at com.atomikos.jdbc.AbstractDataSourceBean.getConnection(AbstractDataSourceBean.java:346)
	at org.springframework.scheduling.quartz.LocalDataSourceJobStore$2.getConnection(LocalDataSourceJobStore.java:135)
	at org.quartz.utils.DBConnectionManager.getConnection(DBConnectionManager.java:108)
	at org.quartz.impl.jdbcjobstore.JobStoreCMT.getNonManagedTXConnection(JobStoreCMT.java:165)
	at org.quartz.impl.jdbcjobstore.JobStoreSupport.doCheckin(JobStoreSupport.java:3322)
	at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.manage(JobStoreSupport.java:3935)
	at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.initialize(JobStoreSupport.java:3920)
	at org.quartz.impl.jdbcjobstore.JobStoreSupport.schedulerStarted(JobStoreSupport.java:692)
	at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:539)
	at org.quartz.impl.StdScheduler.start(StdScheduler.java:142)

问题原因

Druid连接池问题,当Druid与Atomikos搭配时,如果MySQL版本高于8.0.11则不被支持

Github - Druid多数据源整合Atomikos事务高版本MySQL启动报错

解决方法

将数据库降至8.0.11以下的版本,Druid版本升级至1.1.21或者以上

问题三、启动项目出现'Too many connections'错误

问题原因

我的多数据源连接池配置初始连接数量过多,降低连接数量即可

也可以通过查看和修改MySQL的最大支持连接数量来解决该问题

-- 查看连接数信息
show variables like '%connections%';

max_connections	151         # mysql最大连接数
max_user_connections	0       # 单用户连接数   
mysqlx_max_connections	100

-- 修改最大连接数
找到my.ini或者my.cnf,添加或修改'set-variable=max_connections=值'然后重启MySQL服务,接着通过命令mysqladmin -uroot -pxxx -hlocalhost variables可以看到

| max_connections | 1000 |

通过mysqladmin来查看当前连接详细信息

mysqladmin -uroot -pxxx -hlocalhost processlist

+-----+-----------------+-------------------+----+---------+------+------------------------+------------------+
| Id  | User            | Host              | db | Command | Time | State                  | Info             |
+-----+-----------------+-------------------+----+---------+------+------------------------+------------------+
| 5   | event_scheduler | localhost         |    | Daemon  | 582  | Waiting on empty queue |                  |
| 10  | root            | 10.211.55.2:49819 |    | Sleep   | 474  |                        |                  |
| 579 | root            | localhost         |    | Query   | 0    | init                   | show processlist |
+-----+-----------------+-------------------+----+---------+------+------------------------+------------------+

通过mysqladmin查看当前连接数

msyqladmin -uroot -pxxx -hlocalhost status

# Threads就是当前连接数

Uptime: 3904  Threads: 2  Questions: 6907  Slow queries: 0  Opens: 330  Flush tables: 3  Open tables: 251  Queries per second avg: 1.769

通过mysql命令查看当前连接

mysql show processlist # 查看前100条连接

mysql show full processlsit # 查看全部连接信息