MySQL数据库连接池技术

2024-09-08 07:48

本文主要是介绍MySQL数据库连接池技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于数据库连接池的使用,首先我们要明白我们为什么要用它,对应普通的数据库连接操作,通常会涉及到以下一些操作是比较耗时的:

网络通讯,涉及到网络延时及协议通讯
身份验证,涉及安全性检查
连接合法性检查,主要是检查所连接的数据库是否存在
并发控制机制
构造并初始化输出缓冲区
连接成功后的信息保存,日志存储
服务器性能
数据库配置优化
系统分配内存资源
等等~~~状况,导致数据库连接操作比较耗时,~~~而且每次都得花费0.05s~1s的时间
但是使用连接池技术,本质上就是在一个请求对应的连接,都由一个线程池来维护着,也就是说“上下文切换”的代价是线程级别(所谓的纳秒级),对于大规模的并发访问,就算以每秒几亿级别的访问量都是不成问题的。

一、在Java平台

之前一段时间曾经弄过数据库连接池,使用的是c3p0这个工具包,

简单记录下c3p0的使用,当作学习的一个巩固;

第一步导入jar包;

第二步:

把jar包导入进来:

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

第三步:定义变量

private ComboPooledDataSource cpds; 

然后在DbUtil里面使用:

private DbUtil() { 
cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass( driver);
cpds.setJdbcUrl( url );
cpds.setUser(user); 
cpds.setPassword(passwd); 

cpds.setMinPoolSize(5); 
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(30);
cpds.setMaxIdleTime(60);

} catch (PropertyVetoException e) {
e.printStackTrace();

}

最后每个连接里面都可以用上了:

public Connection getConn() { 
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

完整的使用类:

复制代码
package util;import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;public class DbUtil {private static String url = "jdbc:mysql://localhost:3306/zdbang_net";private static String user = "root";private static String passwd = "admin";private static String driver = "com.mysql.jdbc.Driver";private ComboPooledDataSource cpds; private static DbUtil db = new DbUtil();public static DbUtil getInstance() {return db;}private DbUtil() { cpds = new ComboPooledDataSource();try {cpds.setDriverClass( driver);cpds.setJdbcUrl( url );cpds.setUser(user);                                  cpds.setPassword(passwd);  cpds.setMinPoolSize(5);                                     cpds.setAcquireIncrement(5);cpds.setMaxPoolSize(30);cpds.setMaxIdleTime(60);} catch (PropertyVetoException e) {e.printStackTrace();}   }public Connection getConn() {  try {return cpds.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}protected void finalize() throws Throwable {DataSources.destroy(cpds);super.finalize();}public static void closeConn(Connection conn) {try {if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}public static Statement getStmt(Connection conn) {Statement stmt = null;try {stmt = conn.createStatement();return stmt;} catch (SQLException e) {e.printStackTrace();}return null;}public static void closeStmt(Statement stmt) {try {if (stmt != null)stmt.close();} catch (SQLException e) {e.printStackTrace();}}public static PreparedStatement getPs(Connection conn, String sql) {PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);return ps;} catch (SQLException e) {e.printStackTrace();}return null;}public static void closePs(PreparedStatement ps) {try {if (ps != null)ps.close();} catch (SQLException e) {e.printStackTrace();}}public static ResultSet doQuery(Statement stmt, String sql) {try {ResultSet rs = stmt.executeQuery(sql);return rs;} catch (SQLException e) {e.printStackTrace();}return null;}public static void closeRs(ResultSet rs) {try {if (rs != null)rs.close();} catch (SQLException e) {e.printStackTrace();}}    
}
复制代码

具体的源码还没具体看,不过估计实现上也不会太难,争取这段时间看一下源代码。~~~~~

 二、在.Net

没有使用数据库连接池的情况是这样的:每当一个请求过来根据连接字符串新建一个连接,请求结束,数据库连接关闭。

例如:

复制代码
        public static int ExecuteSql(string SQLString){using (SqlConnection connection = new SqlConnection(connectionString)){using (SqlCommand cmd = new SqlCommand(SQLString, connection)){try{connection.Open();cmd.CommandTimeout = 600;int rows = cmd.ExecuteNonQuery();return rows;}catch (System.Data.SqlClient.SqlException e){LogHelper.Log("sqlexception;sql:" + SQLString, e);log.Error("\r\n客户机IP:" + HttpContext.Current.Request.UserHostAddress+ "\r\n错误地址:" + HttpContext.Current.Request.Url + "\r\n", e);connection.Close();throw e;}}}}
复制代码

请求的字符串就是:connectionString

然后每一个连接字符串都会当作是一个新的连接请求。

这样子对于一些小型的web项目还是可以的,毕竟并发量不会太大。但是对于大型网站,访问量很大,切换连接的开销就会非常的大,对系统而言是一个很大的瓶颈;而使用连接池比较只是在线程基本把连接给屏蔽掉(纳秒级),所以使用连接池对整个网站而言是有很大的好处的;



参考资料1:  http://www.cnblogs.com/super-d2/archive/2013/01/24/2875646.html

参考资料2:http://blog.csdn.net/liang5630/article/details/39055805






这篇关于MySQL数据库连接池技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147531

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key: