数据库: java使用Druid连接池连接MySQL数据库
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnMysql" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
Druid
Druid 连接池是阿里巴巴开源的数据库连接池项目.
https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D
为啥要用连接池
1. 数据库本身也是个 TCP 服务器, 客户端和数据库通信首先需要先连接 TCP 服务器
然后再根据数据库的协议连接上数据库.
服务器回复 "Response OK" 的消息体就说明连接上了.
2. 现在有两个问题需要解决: 很多用户连接通信的问题 , 和需要快速操作数据的问题
实际上连接数据库的客户端的个数是有限的;
如果有 200 个用户同时都建立链接, 那么有一部分用户就连接不上了.
用户可以用命令看一下 show variables like '%max_connections%';
咱每次操作数据库的时候都需要连接的步骤, 这个步骤每次都有延迟!!体验一点不好!
3. 解决以上问题的最好方式是加一个对外的接口和一个连接池
对外接口的作用是拿到数据以后调用数据库连接池, 然后由连接池和数据库通信.
数据库连接池其实就是提前预先建立了多个数据库连接对象;
假设建立了 20 个和数据库的连接.
4. 连接池的作用
连接池里面的的客户端都是早已和数据库连接着的, 当需要和数据库通信的时候
就从里面取出一个来客户端, 然后发数据通信. 省去了连接数据库的过程, 提高了效率!
如果请求非常多, 那么最多也就只有 20 个连接. 不会造成因为连接个数过多而导致数据库性能下降!
注: 有些用户会想, 这不是也有问题嘛! 才 20 个! 接着往下看!
连接池的作用就是省去了连接数据库的过程, 提高了数据通信速度.
防止过多的连接和数据库相连而导致数据库性能下降!
5. 接口的作用
在网络通信中, 这个接口一般是 http 接口, 当然也可以是 TCP 接口,mqtt 接口,WebSocket 接口等; 以下皆说为 接口
接口的作用一部分是为了接受客户过来的数据, 另一部分就是缓存用户过来的数据.
然后呢就是不停的到数据库连接池里面去拿连接对象, 然后和数据库进行交互!
然后有人会问? 解决了 20 个问题了没??
可以说解决了 99% 了.
大家要明确一个事情, 看似数据被缓存了不假 , 但是网络通信的速度是非常快的, 其实上百个乃至上千个用户访问数据
他们不会感受到的.
剩下的 1% 其实就是应对极端情况, 上百万, 千万的人...
内部处理思路还是上面那个样子, 但是呢为了应对这种极端情况就要采取下面的措施
1. 优化代码, 提高代码的执行效率
2. 多开几台服务器
Druid 连接池使用
Druid 其实是对连接数据库的对象进行管理, 所以咱也需要连接数据库的 jar 包 (JDBC).
因为 5.X 的 MySQL 数据库和 8.X 的 MySQL 数据库的连接 jar 包不一样了, 所以我提供了两份程序.
注: 两份程序的 Druid 的 jar 包是一样的, 只是连接 MySQL 数据库 jar 不一样
先看连接 8.X 的数据库 (运行可能报错, 请往下面看)
1. 导入 jar 包什么的自己导入, 我用的软件是 intellij idea
2. 数据库
3. 我只写了插入一个数据的程序
package com.company;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class Main {
/声明 Druid 连接池的对象/
private static DruidDataSource dataSource;
/8.X 版本连接器写法/
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
/数据库地址/
static final String DB_URL = "jdbc:mysql://localhost/userinfo?" +
"useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT";
public static void main(String[] args) {
initDataSource();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 初始化连接池</span>
<span style="color: rgba(0, 0, 255, 1)">try</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入一个数据</span>
String sql = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insert into userinfo (username,password)</span><span style="color: rgba(128, 0, 0, 1)">"</span>+ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">values(</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">"</span>+ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">yangyang</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">"</span>+ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">11111111</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
Connection connection </span>= getConnect();<span style="color: rgba(0, 128, 0, 1)">//在连接池里面</span><span style="color: rgba(0, 128, 0, 1)">获取连接对象</span>
PreparedStatement ps = connection.prepareStatement(sql);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">预编译下SQL语句</span>
<span style="color: rgba(0, 0, 255, 1)">int</span> count = ps.executeUpdate();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交SQL语句</span>
System.<span style="color: rgba(0, 0, 255, 1)">out</span>.println(count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印受影响的行数(不为0说明执行了!)</span>
}<span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e){
System.</span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.println(e.toString());
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 初始化连接池</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> initDataSource() {
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
dataSource </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> DruidDataSource(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建Druid连接池</span>
dataSource.setDriverClassName(JDBC_DRIVER); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置连接池的数据库驱动</span>
dataSource.setUrl(DB_URL); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置数据库的连接地址</span>
dataSource.setUsername(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">iot</span><span style="color: rgba(128, 0, 0, 1)">"</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库的用户名</span>
dataSource.setPassword(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">11223344.</span><span style="color: rgba(128, 0, 0, 1)">"</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库的密码</span>
dataSource.setInitialSize(<span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置连接池的初始大小</span>
dataSource.setMinIdle(<span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置连接池大小的下限</span>
dataSource.setMaxActive(<span style="color: rgba(128, 0, 128, 1)">20</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置连接池大小的上限</span>
}<span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e){
System.</span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.println(e.toString());
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//从连接池里面</span><span style="color: rgba(0, 128, 0, 1)">获取一个连接对象</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Connection getConnect() throws Exception{
Connection con</span>=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
con</span>=<span style="color: rgba(0, 0, 0, 1)">dataSource.getConnection();
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
</span><span style="color: rgba(0, 0, 255, 1)">throw</span><span style="color: rgba(0, 0, 0, 1)"> e;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> con;
}
}
4. 运行以后
5. 提示:8.0 的需要 JDK1.8 版本的, 如果你的 jar 包是 1.8 以下版本的将会报错
用户可以安装上 1.8 版本的 jar 包,
注意只安装上, 不用配置环境变量!
注意只安装上, 不用配置环境变量!
注意只安装上, 不用配置环境变量!
然后设置下软件使用的 jdk (根据自己的软件百度下设置 JDK)
其实就是选择下 JDK 的安装路径 (根据自己的软件百度)
选择要使用的 JDK 版本
现在看连接 5.X 的数据库
1. 把 jar 包换了
2.JDK 选择的 1.7
3. 驱动器名字改为了
4. 运行测试