Spring数据库连接池url参数踩坑及解决

yizhihongxing

Spring数据库连接池url参数踩坑及解决

在使用Spring数据库连接池时,很多开发者可能会遇到一些莫名其妙的问题,比如连接不上、连接超时、连接池达到最大连接数等等,这些问题可能很难排查。其中一个容易被忽视的问题是url参数配置不当,这会导致数据库连接池的异常。

1. url参数

首先,我们来了解一下url参数有哪些,以及它们分别代表什么含义。下面是比较常见的几个参数:

  • jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

  • useUnicode=true:使用Unicode字符集,可避免中文乱码;

  • characterEncoding=utf-8:设定字符编码为utf-8;
  • allowMultiQueries=true:开启允许多语句查询。

  • jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useSSL=false

  • user=root:指定数据库用户名;

  • password=123456:指定数据库密码;
  • useSSL=false:禁用SSL连接。

我们在使用Spring连接池时,经常需要配置连接池的参数,如下:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
    <property name="user" value="root" />
    <property name="password" value="123456" />
    <property name="initialPoolSize" value="5" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="40" />
    <property name="acquireIncrement" value="2" />
</bean>

注意:上述配置中没有包括url的参数,因为Spring在访问数据库时会自动加上一些参数,如useUnicode、characterEncoding等。

2. 问题的产生

但是有时候,我们自己也会在url中加入一些参数,比如allowMultiQueries=true。这时,就可能会出现一些问题。

比如下面的配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?allowMultiQueries=true" />
    <property name="user" value="root" />
    <property name="password" value="123456" />
    <property name="initialPoolSize" value="5" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="40" />
    <property name="acquireIncrement" value="2" />
</bean>

虽然加了allowMultiQueries参数,但是会发现,这并没有起到作用,依然无法执行多查询语句。而且,这时c3p0连接池也可能会出现一些问题,比如连接超时,连接不上等等。

3. 解决方案

原因就是Spring会自动将一些参数拼接到url中,重复的参数就会覆盖掉我们自己写的参数。解决方案也很简单,只需要在参数后面再加上&号即可。

比如,正确的配置应该是:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?allowMultiQueries=true&amp;useUnicode=true&amp;characterEncoding=utf-8" />
    <property name="user" value="root" />
    <property name="password" value="123456" />
    <property name="initialPoolSize" value="5" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="40" />
    <property name="acquireIncrement" value="2" />
</bean>

需要注意的是,在加上&号后,用来分隔参数的“&”号,需要转义为&。

另外,使用Spring和一些开源框架的时候,建议不要在url中添加额外的参数,如果想要增加配置的话,可以通过Spring提供的setter方法,来设置一些特殊的参数。

4. 示例说明

示例一

现在我有一个Spring的连接池配置,如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    <property name="maxActive" value="100"/>
    <property name="maxIdle" value="20"/>
    <property name="maxWait" value="1000"/>
</bean>

连接数据库时,会出现以下异常:

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

这是由于MySQL 8.0以上版本将serverTimezone配置为UTC时,driver一定要配置成8.0以上版本,否则需要设置server时区为别的(比如Asia/Shanghai)。

解决方法是在url中添加serverTimezone参数,修改后的配置如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    <property name="maxActive" value="100"/>
    <property name="maxIdle" value="20"/>
    <property name="maxWait" value="1000"/>
</bean>

示例二

再来看一个连接不上数据库的问题。比如下面的配置:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
</bean>

启动应用时,会抛出如下异常:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

这是由于MySQL对root用户的连接进行了限制,需要在MySQL中增加root的授权。可以通过如下命令进行授权:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;

然后重新启动应用,就可以成功连接数据库了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring数据库连接池url参数踩坑及解决 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 分享mysql的current_timestamp小坑及解决

    下面是关于“分享mysql的current_timestamp小坑及解决”的详细攻略。 1. 背景介绍 在使用MySQL中,current_timestamp是一个常用的函数,可以获取当前时间。然而,使用current_timestamp时,会有一些小坑,可能导致程序出现异常。本文将介绍这些小坑,并提供解决方法。 2. current_timestamp小坑…

    database 2023年5月22日
    00
  • CentOS系统上安装配置Oracle数据库的详细教程

    CentOS系统上安装配置Oracle数据库的详细教程 下面将介绍在CentOS系统上安装配置Oracle数据库的详细教程。 1. 下载Oracle数据库软件 请前往Oracle官网下载Oracle Database软件(版本自行选择)。 2. 安装必要的软件包 安装必要的软件包,执行以下代码: yum install -y binutils compat-…

    database 2023年5月22日
    00
  • mysql-8.0.17-winx64 部署方法

    关于“mysql-8.0.17-winx64 部署方法”,以下是详细的攻略: 下载 MySQL 安装包 首先,我们需要到 MySQL 官网(https://dev.mysql.com/downloads/mysql/)下载 MySQL 安装包。 点击“MySQL Community Edition”进行下载。 安装 MySQL 执行安装包。 选择“Devel…

    database 2023年5月22日
    00
  • CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法

    下面是CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法的完整攻略。 安装redis 首先需要安装gcc,用于编译redis源码。 yum install gcc 下载redis4.0.1(stable)源码包。可以到redis官网或者Github下载。 wget http://download.redis.io/releas…

    database 2023年5月22日
    00
  • mysql慢查询日志轮转_MySQL慢查询日志实操

    MySQL慢查询日志实操 MySQL慢查询日志可以记录执行时间超过设定阈值的SQL语句,方便进行性能分析和优化。但是如果日志文件过大,会占用大量磁盘空间,因此需要进行日志轮转。本文将详细讲解MySQL慢查询日志的轮转操作。 检查慢查询日志状态 在进行日志轮转操作之前,我们需要确认慢查询日志是否已经开启。可以通过以下命令查看慢查询日志是否开启: show va…

    database 2023年5月22日
    00
  • 详解Oracle自定义异常示例

    我来为您详细讲解“详解Oracle自定义异常示例”的完整攻略。 什么是Oracle自定义异常 在Oracle数据库开发中,我们可以自定义异常。自定义异常是指用户自己定义的异常,通过raise语句抛出。与系统定义的异常不同,自定义异常可以根据具体情况定义异常信息和处理方式,让我们的程序变得更加灵活和易于维护。 Oracle自定义异常语法 Oracle自定义异常…

    database 2023年5月21日
    00
  • vs2019 下用 vb.net编写窗体程序连接 mongodb4.2的方法

    一、安装MongoDB.Driver程序包 在Visual Studio 2019中创建一个VB.NET的Windows窗体应用程序,接下来需要安装MongoDB.Driver程序包,才能连接MongoDB数据。在Visual Studio 2019中打开「解决方案资源管理器」,右键点击项目名称,选择「管理 NuGet程序包」,在NuGet包管理器中搜索Mo…

    database 2023年5月22日
    00
  • linux下源码安装mysql5.6.20教程

    以下是Linux下源码安装mysql5.6.20的完整攻略。 一、前置条件 在进行安装之前,请确保已经满足以下要求: 已经安装了必要的依赖包: gcc,make,cmake,libncurses5-dev。 已经下载了mysql5.6.20的源码包,并解压到目标目录。 二、安装步骤 进入mysql源码目录,执行以下命令进行配置: cmake . -DCMAK…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部