环境
- 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
源码跟踪
通过跟踪源码可知,如果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 # 查看全部连接信息