前言
Druid是阿里巴巴开源的一个高效、可靠的数据库连接池。但是,在使用低版本的Druid连接MySQL数据库时,如果使用MySQL8.0的驱动程序会出现线程阻塞、性能受限等问题,导致无法正常使用。
原因分析
在Druid的低版本中,存在一个锁机制,对于每个数据库连接,都会为其分配一个“真正的物理连接”来执行SQL。这会导致在多线程环境下出现别的线程一直在等待某个连接“释放”(归还到连接池中)的问题。在MySQL8.0中,由于MySQL对于默认驱动程序的改进,这个锁机制的问题更加严重了。因此,使用低版本Druid连接MySQL8.0的驱动程序时,会出现线程阻塞,导致性能受限。
解决方法
1.升级Druid
针对这个问题,官方提供了比较简单的解决方法,那就是升级Druid连接池。在新版本中,Druid对线程池和连接池的实现进行了优化,解决了低版本中的这个问题。如果不希望升级Druid,下面的解决方法也可以解决这个问题。
2.更换MySQL驱动
另外一个更好的解决方法是更换MySQL驱动程序。由于MySQL默认驱动的问题,让低版本的Druid连接MySQL8.0驱动时性能受限,但是使用高版本的MySQL驱动则不会出现这个问题。因此,我们可以直接将MySQL8.0驱动替换为高版本的MySQL驱动或者其他支持MySQL8.0的第三方驱动(如:MariaDB驱动)。
示例说明
1.通过升级Druid进行解决
在原有的项目pom.xml中将Druid的版本修改为最新版本即可,建议使用maven或gradle进行依赖管理。
<!-- 引入最新版的Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.7</version>
</dependency>
例如在Spring Boot项目中,只需要修改pom.xml即可。当然,如果您使用的是JDBC的方式连接MySQL,也需要修改MySQL驱动的版本号。
2.通过更换MySQL驱动进行解决
在Spring Boot项目中,只需要将原来的mysql-connector-java 8.0驱动替换为高版本MySQL或MariaDB的驱动即可解决问题。在pom.xml中修改驱动的版本号即可,如下所示:
<!-- 更换MySQL驱动版本 -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.1</version>
</dependency>
总结
该问题是Druid和MySQL驱动程序默认设置引起的,如果您使用的Druid版本较旧的话,可以选择升级Druid连接池,如果您使用的是MySQL 8.0驱动程序,则建议更换到其他版本驱动程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限 - Python技术站