使用JDBC是怎么保证数据库客户端和数据库服务端进行连接的?

通过代码:

conn=DriverManager.getConnection(url, username, password);

JDBC通过这条代码方法的调用建立了一条客户端应用程序到后端数据库的物理连接。期间发生了大量的基于TCP的客户端与服务端的交互。

由于跨机器的网络传输是由较大的网络开销的,所以时间花销很大。

传统的多线程JDBC服务中,我们每进行一次服务都需要分配一个线程,每一个线程去建立一个数据库连接,当这条服务结束之后,该线程和该数据库连接都将被销毁。

当我们需要下一次数据库服务时,再次建立新的线程和数据库连接。

这样每次在建立数据库连接上浪费了大量的时间,用户的相应时间变得很慢。

连接池的出现就是为了解决这个问题,连接池实现了数据库连接(connection对象)的复用,当一个线程处理完相应程序服务,随后不紧接着销毁数据库连接,而是把它交给下一个线程使用。这样就避免了多次建立数据库连接而浪费时间的问题出现。实现了从每个线程创建数据库连接到每个线程租用数据库连接的转变。

MySQL数据库内部是怎么分配各种连接的?

在MySQL数据库中也存在着内存限制,当分配的数据库连接过多,会增加数据库内存的占用,加剧各种锁的冲突,占用数据库资源,甚至造成数据库崩溃。所以一般在MySQL数据库中设置最大连接数。

但是,为了保证不出现上述问题,我们可以在连接请求到达数据库之前进行限流,保证数据库资源的优化利用,效率至上。连接池就起到了这个作用:限制连接。

连接池到底是什么?

连接池本质上就是一组java的jar包,介于java应用和JDBC数据库物理连接之间,帮助应用程序来管理数据库连接,通过连接池暴露的接口,应用程序可以获取JDBC连接,使用完后

将JDBC归还给连接池,供下一个线程使用。

在连接池中,数据库连接不足的时候,会自动创建连接;同时当空闲连接过多时也会自动销毁连接。

当多个线程同时访问时,连接池还提供了排队等待的功能。保证了应用程序有序地获取数据库连接。

连接池怎么使用?(相关示例代码贴在后面)

以现在最受欢迎的JDCP连接池为例。

相关jar包下载地址:

其中,有两种jar版本,windows推荐下载.zip版

关于两版的差别,参考:

1)创建一个连接池对象(BasicDataSource):

因为JDCP的底层也是通过JDBC来实现的,所以我们需要告诉它相应的信息。

通过BasicDataSource对象的一系列方法,来对连接池进行相关设置(基础的和高级的)

相关高级配置:

连接数配置:

其中建议:将setMaxIdle()和setMinIdle()设置为相同的值。

DBCP定期检查:

数据库服务端为了释放空闲等待的资源,默认会自动关闭空闲时间等待超过某个阈值的连接。MySQL默认阈值为8个小时。

但是,连接池不知道那个连接失效了,以防止连接池将失效的连接租借给应用程序,所以需要定期检查。

保证连接池和数据库服务端连接对象同步性,保证,连接池租借给应用程序的连接对象都是有效的。

建议:连接池中连接对象的销毁时间阈值要小于数据库服务器的销毁时间阈值。也就是说要在数据库服务器销毁连接对象前,连接池先销毁连接对象。保证连接池中连接对象的有效性。

2)通过BasicDataSource对象获取数据库连接对象(connection),然后跟JDBC中相似进行相关数据库服务的调用。

注意,我们同样需要在一系列操作过后,调用connection对象的close()方法。

但是连接池重写了connection对象的close()方法,使得它的功能不再是将connection对象销毁,而是将connection对象归还给连接池,以供下一个线程调用。

相关示例代码:

packagecom.java_JDCP;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importorg.apache.commons.dbcp2.BasicDataSource;public classJDCP_test {private static String driverClassName="com.mysql.jdbc.Driver"; //数据库驱动//连接数据库的URL地址

private static String url="jdbc:mysql://localhost:3306/hellojdbc?useUnicode=true&characterEncoding=UTF-8";private static String username="root";//数据库连接用户名

private static String password="123456";//数据库连接密码

private static Connection conn=null;//数据库连接对象

private static Statement stat=null;//语句陈述对象

private static ResultSet rs=null;//结果数据集

private static BasicDataSource ds=null;//BasicDataSource对象的相关初始化

public static voidjdcpInit(){

ds=new BasicDataSource();//创建BasicDataSource对象

ds.setUrl(url);

ds.setDriverClassName(driverClassName);

ds.setUsername(username);

ds.setPassword(password);

ds.setMaxIdle(2);//设置连接池中存在的最大连接对象的数量为2个

}public static voidmain(String[] args) {

jdcpInit();try{

conn=ds.getConnection();//从BasicDataSource对象中获取数据库连接//一下的操作就和JDBC相同了

stat=conn.createStatement();

rs=stat.executeQuery("select * from roster");while(rs.next())

System.out.println("name:"+rs.getString("name"));

}catch(SQLException e) {

e.printStackTrace();

}finally{try{if(rs!=null)

rs.close();if(stat!=null)

stat.close();if(conn!=null)

conn.close();//释放数据库连接,这里连接池重写了JDBC中数据库连接(connection对象)的close()方法,原来是销毁,现在是归还给连接池,以供下个线程调用

} catch(SQLException e) {

e.printStackTrace();

}

}

}

}

mysql连接池设计_数据库连接池(基于MySQL数据库)相关推荐

  1. oracle mysql连接池配置文件_数据库连接池两种配置方式详解

    数据库连接池: 负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接 ...

  2. 高并发内存池设计_内存池

    高并发内存池设计 1. 常用的内存操作函数 2. 高性能内存池设计_弊端解决之道 弊端一 弊端二 弊端三 弊端四 3. 弊端解决之道 内存管理维度分析 内存管理组件选型 4. 高并发内存管理最佳实践 ...

  3. c3p0 mysql 连接池配置文件_数据库连接池c3p0的使用

    原标题:数据库连接池c3p0的使用 来源:java联盟 https://mp.weixin.qq.com/s/5Tbkf8dVFfH8AvtqWl-7Xg 程序员共读整理发布,转载请联系作者获得授权 ...

  4. hikaricp 连接池分析_数据库连接池终于搞对了,这次直接从100ms优化到3ms!

    我在研究HikariCP(一个数据库连接池)时无意间在HikariCP的Github wiki上看到了一篇文章(即前面给出的链接),这篇文章有力地消除了我一直以来的疑虑,看完之后感觉神清气爽.故在此做 ...

  5. mysql连接密码加密_数据库连接用户名和密码加密

    我们的工程项目往往是使用云数据库的,连接使用账号密码就行了,但是程序里直接有密码是十分不安全的 这里我参考了别人的博客对这个问题进行解决 1. 需求背景 我们在开发应用时,需要连接数据库,一般把数据库 ...

  6. mysql连接不断线_某些小时后MySql连接自动掉线

    mysql连接不断线 MySql配置为删除任何闲置超过8小时的连接. 这意味着什么? 在8个小时的间隔后返回到已部署的应用程序之后(如果未更改默认SQL参数),将会遇到异常情况. 如何解决这个问题? ...

  7. mysql连接字符串 端口_浅析C#下MySQL连接字符串数据库服务器端口号

    正常的C#下MySQL连接字符串配置,这是在MSSQL服务器端口是1433(默认)的情况下. 但是有时候,为了数据库服务器安全,这个端口会被改成其它的,这时再用这C#下MySQL连接字符串,连接数据库 ...

  8. mysql连接提示错误_服务器经常提示mysql连接错误,有木有解决方法?

    网络是联通的,因为在同一主机内,本地连接到mysql服务器,和运行环境无关,php,python连接数据库都有这种情况出现 提示Can't connect to MySQL server on 'lo ...

  9. mysql连接字符串 端口_数据库连接字符串 端口号

    如何获取SQL server数据库的连接字符串 步骤:1.新建一个txt文本文档,然后把后缀名改为udl2.打开 新建文本文档. udl ,并选择相应的数据库进行连接,之后点击 "测试连接& ...

最新文章

  1. fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭...
  2. 差分约束系统【模板】
  3. PHPCMS调用相关
  4. 使用Spring和Hibernate进行集成测试有多酷
  5. .Net Micro Framework研究—实现SideShow窗体界面
  6. 老程序员应该记住的 5 件事
  7. 女生学计算机和遥感哪个好就业,遥感专业女生就业方向 遥感专业毕业生可以从事哪些工作...
  8. 激光雷达在自动驾驶中的应用
  9. LTE学习-信道均衡(ZF)
  10. 群晖NAS同步阿里云盘
  11. 我儿喜欢摸奶奶 什么原因_我是奶奶,我的编码职业才刚刚开始
  12. python读写 doc文件和docx文件
  13. SAS 方差分析(复习4)
  14. Oracle 服务器 客户端 US7ASCII、 UTF8字符编码问题
  15. python 处理 Excel 表格
  16. 微信小程序,图片双指放大缩小
  17. jq 使用jSignature.js实现电子签名
  18. 深入理解操作系统实验——bomb lab(phase_2)
  19. Mackevision 发布 2016 年回顾与展望
  20. 【日常记录】解决‘GLIBC_2.34‘ not found,并且gcc制定glibc版本编译

热门文章

  1. 编写歌唱比赛评分_甦醒丨歌唱大赛作品评分
  2. docker exec 权限问题,准成,亲自验证过,成功!!!
  3. 计算机应用基础模块2客观题答案 文档,卓顶精文2019计算机应用基础网上形考答案模块2 Word 2010 文字处理系统客观题答案...
  4. 电脑重启f12怎么处理_电脑开机按f12怎么恢复系统(详解f12的使用方法)
  5. 计算机 专升硕,2020新西兰专升硕计算机专业可选院校有哪些?新西兰专升硕途径详解!...
  6. 怎么把css改成打印,css 打印print
  7. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结
  8. PHP小程序码扫码登录网站,WeAuth微信小程序实现PC网站扫码授权登录
  9. php购物网站类的继承和多态,类的继承与多态
  10. 用Java控制小电灯-树莓派PI4J