开发者社区> 问答> 正文

Druid与mariadb兼容性问题

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

展开
收起
山海行 2023-07-05 19:45:28 168 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    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特殊的系统变量。

    2023-07-30 15:37:19
    赞同 展开评论 打赏
  • 设置testOnBorrow=true防止拿到无效连接,如果凑巧拿到无效连接,就要检查下自己的超时设置,不然会长时间挂住。如果使用长连接且有负载均衡,需要注意服务端的连接超时时间不能大于负载均衡端的超时时间。

    原回答者GitHub用户ly576078

    2023-07-06 11:04:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载