Springboot 2.0.4集成druid访问mysql数据库,服务运行过程中偶现如下错误: ERROR c.alibaba.druid.pool.DruidDataSource - recyle error java.sql.SQLException: Connection.clearWarnings cannot be called on a closed connection at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getSqlException(ExceptionMapper.java:271) at org.mariadb.jdbc.MariaDbConnection.clearWarnings(MariaDbConnection.java:1070) at com.alibaba.druid.filter.FilterChainImpl.connection_clearWarnings(FilterChainImpl.java:165) at com.alibaba.druid.filter.FilterAdapter.connection_clearWarnings(FilterAdapter.java:771) at com.alibaba.druid.filter.FilterChainImpl.connection_clearWarnings(FilterChainImpl.java:161) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.clearWarnings(ConnectionProxyImpl.java:108) at com.alibaba.druid.pool.DruidConnectionHolder.reset(DruidConnectionHolder.java:295) at com.alibaba.druid.pool.DruidDataSource.recycle(DruidDataSource.java:1662) at com.alibaba.druid.pool.DruidPooledConnection.recycle(DruidPooledConnection.java:323) at com.alibaba.druid.filter.FilterChainImpl.dataSource_recycle(FilterChainImpl.java:4609) at com.alibaba.druid.filter.stat.StatFilter.dataSource_releaseConnection(StatFilter.java:665) at com.alibaba.druid.filter.FilterChainImpl.dataSource_recycle(FilterChainImpl.java:4605) at com.alibaba.druid.pool.DruidPooledConnection.close(DruidPooledConnection.java:266) at org.springframework.jdbc.datasource.DataSourceUtils.doCloseConnection(DataSourceUtils.java:354) at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:341) at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:307) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:618) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:657) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:688) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:842)
druid配置如下: driver-class-name=org.mariadb.jdbc.Driver type=com.alibaba.druid.pool.DruidDataSource maxWait=180000 maxActive=20 minIdle=10 initialSize=10 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 validationQuery=select 'x' testWhileIdle=true testOnBorrow=false testOnReturn=false
原提问者GitHub用户ly576078
Druid与MariaDB的兼容性总的来说还不错,但也存在一些差异:
Druid主要是针对Oracle和MySQL开发的,而MariaDB是一个MySQL的分支。两者有一些语法上的差异。
MariaDB支持一些MySQL没有的特性,比如系统变量和架构部分。Druid可能不支持这些特性。
Druid支持部分MySQL的扩展语法,但MariaDB 对此支持有限。
主要的兼容性问题包括:
1). 语法不兼容
如MariaDB支持的@@符号语法,Druid可能会解析错误。
2). 函数不兼容
MariaDB支持的一些特殊函数Druid可能不识别。
3). SQL模式不兼容
MariaDB的SQL模式Druid可能不支持。
4). 系统变量不兼容
MariaDB支持的系统变量Druid可能解析不正确。
为了解决这些兼容性问题,可以采用以下方法:
升级Druid版本。后续的Druid版本会增加对MariaDB更多特性的支持。
优化SQL。避免使用MariaDB特定的语法和函数,使用通用的SQL语法。
修改Druid解析器。针对不兼容的特性重写或扩展Druid的SQL解析器。
避免使用不兼容的特性。比如避免使用MariaDB特殊的系统变量。
设置testOnBorrow=true防止拿到无效连接,如果凑巧拿到无效连接,就要检查下自己的超时设置,不然会长时间挂住。如果使用长连接且有负载均衡,需要注意服务端的连接超时时间不能大于负载均衡端的超时时间。
原回答者GitHub用户ly576078
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。