探秘大型数据库池的应用场景与实现案例 (数据库大池案例)
随着网络技术的不断发展和互联网应用的广泛普及,大型数据库的存储和管理成为了一个非常重要的问题。传统的数据库管理方式已经无法满足大规模应用的需求,数据库池技术应运而生。在本文中,将会探秘大型数据库池的应用场景和实现案例。
一、大型数据库池的应用场景
大型数据库池是一种管理和维护大规模数据库存储的技术,它可以大幅度提高数据库的性能和可靠性。在大规模应用中,比如企业级的CRM系统、电商平台和门户网站,都需要支持大量的用户和数据的存储和管理。在这些应用中,大型数据库池被广泛应用,其应用场景主要包括以下几个方面:
1.高并发访问
在高并发的访问场景下,数据库需要处理大量的请求,这就需要数据库的负载均衡和高效的连接池管理。大型数据库池可以通过连接复用、连接池管理等方式来提高并发处理能力。
2. 大数据量存储
随着数据量的增长,单个数据库的容量可能会达到上千万甚至亿级别。在这种情况下,单节点数据库的查询效率和数据存储效率都会受到严重影响。此时,大型数据库池可以通过分库分表的方式来提高数据库的查询速度和数据存储效率。
3. 高可靠性和高可用性
在高可靠性和高可用性的要求下,大型数据库池可以通过系统容错和备份技术来保证数据库数据的安全性。例如,在主节点发生故障时,备用节点可以接管故障节点并维持数据库的正常运行。
二、大型数据库池的实现案例
目前,大型数据库池的实现技术比较成熟,主要有MsSQL、Oracle、MySQL、PostGreSQL等数据库。下面以MySQL为例,介绍大型数据库池的实现方式。
1. 垂直扩展
数据库垂直扩展是指通过增加单节点的计算和存储能力来扩大数据库的存储和管理范围。垂直扩展是一种简单而有效的技术,可以通过增加硬件来提高数据库的单节点性能。但是,垂直扩展存在着性能瓶颈和成本问题,因此在大规模应用中,垂直扩展并不是更好的选择。
2. 水平扩展
数据库水平扩展是指通过增加节点的数量来扩大数据库的存储和管理范围。水平扩展与垂直扩展相比,可以更好地解决性能瓶颈和成本问题。大型数据库池利用了水平扩展的技术,通过分库分表将数据库数据存储在多个节点上,从而实现数据的分布式存储和管理。
3. 分布式事务
在分布式的场景下,事务的管理变得非常复杂。大型数据库池可以通过支持分布式事务来解决这个问题。在MySQL中,可以使用XA协议、两阶段提交等技术来实现分布式事务管理。
4. 数据复制和备份
在大型数据库池中,数据复制和备份是非常重要的技术。通过数据复制,可以将主节点的数据复制到备用节点上,从而保证数据的安全性和可靠性。在MySQL中,可以使用主从复制的技术来实现数据复制和备份。
5. 负载均衡和连接池管理
大型数据库池需要处理大量的请求,因此负载均衡和连接池管理变得非常重要。在MySQL中,可以使用MySQL-proxy、HAProxy等负载均衡软件来实现负载均衡和连接池管理。
总体来看,大型数据库池是一种很有前景的技术,可以解决大规模应用中的数据库存储和管理问题。随着互联网应用的不断发展和数据量的呈现爆发式增长,大型数据库池技术将会越来越受到关注和重视。
相关问题拓展阅读:
- 如何区分Oracle的数据库,实例,服务名,SID
- 超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了更大池大
- 常用的数据库连接池
如何区分Oracle的数据库,实例,服务名,SID
Oracle的数据库:
一系列物理文件的
包括控制文件、数据文件、联机日志文件、参数文件、密码文件等
即:Oracle Database = Controlfile + datafile + logfiel + spfile +..
1.控制文件(controlfile)
数据库的名字,检查点信息,数据库创建的时间戳
所有的数据文件,联机日志文件,归档日志文件信息
备份信息等
2.数据文件(datafile)
包含了用户和应用程序的所有数据
–查看数据文件信息
3.联机日志文件
记录了用户对数据库的所有操作,一个数据库中至少要有两个日志组文件,每个日志组中至少有一个日志成员
日志组中的多个日志成员是互为镜相关系
4.归档日志文件
Oracle可以运行在两种模式之中,归档模式和非归档模式。在归档模式中,为了保存用户的所有修改,
在联机日志文件切换后和被覆盖之间系统将他们另外保存成一组连续的文件系列,该文件系列就是归档日志文件。
用户恢复意外情况出现的数据丢失、异常等。
5.参数文件(pfile和spfile)
initSID.ora或init.ora文件,通常位于:$ORACLE_BASE/admin//pfile
初始化文件记载了许多数据库的启动参数,如内存,控制文件,进程数等,在数据库启动的时候加载(Nomount时加载)
6.其他文件
密码文件:用于Oracle 的具有sysdba权限用户的认证.
告警日志文件:报警日志文件(alert.log或alrt.ora),记录数据库启动,关闭和一些重要的出错信息
查看路径:select value from v$PARAMETER where name =‘background_dump_dest’;
7.数据库逻辑组织结构
表空间、段、区、块
一个数据库由一个或多个表空间组成,一个表空间只能属于一个数据库
一个表空间由一个或多个多个数据文件组成,一个数据文件只能属于一个表空间
一个数据文件由一个或多个操作系统块组成,每一个操作系统块只能数以一个数据文件
一个表空间可以包含一个或多个段,一个段只能属于一个表空间
一个段由一个或多个区组成,每一个区只能属于一个段
一个区由一个或多个Oracle 块组成,每一个Oracle块只能属于一个区
一个区只能属于一个数据文件,数据文件的空间可以分配到一个或多个区
一个Oracle 块由一个或多个操作系统块组成,一个操作系统块是一个Oracle块的一部分
oracle实例:
一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。
即:Oracle Server = Oracle Instance + Oracle Database
Oracle实例
包括了内存结构(SGA)和一系列后台进程(Background Process),两者合起来称为一个Oracle实例
即:Oracle Instance = SGA + Background Process
Oracle内存结构
包含系统全局区(SGA)和程序全局区(PGA)
即Oracle Memory Structures = SGA + PGA
SGA由服务器和后台进程共享
PGA包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反,PGA是
只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。即由服务器进程产生。
1.SGA
系统全局区SGA,SGA = 数据缓冲区+ 重做日志缓冲区+ 共享池+ 大池+ Java 池+ 流池
系统全局区是动态的,由参数SGA_MAX_SIZE决定。
查看当前系统的SGA大小:show parameter sga_max_size;
要修改:alter system set sga_max_size=1200m scope=spfile;
因为实例内存的分配是在数据库启动时进行的,所以要让修改生效,要重启数据库。
ORACLE 10G 引入了AM(自动共享内存管理),DBA只需设置SGA_TARGET,ORACLE就会
自动的对共享池、JAVA池、大池、数据缓冲区、流池进行自动调配。取消自动调配就是
sga_target设为。
数据缓冲区(Database buffer cache):存储从数据文件中获得的数据块的镜像
大小由db_cache_size 决定
查看:show parameter db_cache_size;
设置:alter system set db_cache_size=800M;
重做日志缓冲区(Redo log buffer):对数据库的任何修改都按顺序被记录在该缓冲,然后由LGWR进程将
它写入磁盘,大小由LOG_BUFFER决定
共享池(Shared pool):是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据
字典缓存组成,它的作用是存放频繁使用的sql,在有限的容量下,数据库系统根据一定的算法决
定何时释放共享池中的sql。
库缓存大小由shared_pool_size 决定
查看:show parameter shared_pool_size
修改:alter system set shared_pool_size=120m;
数据字典缓存:
存储数据库中数据文件、表、索引、列、用户和其它数据对象的定义和权限信息
大小由shared_pool_size 决定,不能单独指定
大池(Large pool):是一个可选的区域,用于一些大型的进程如Oracle的备份恢复操作、IO服务器进程等
Java 池:该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小
流池(Stream pool):被Oracle流所使用
2.PGA
是为每个用户进程连接ORACLE数据库保留的内存
进程创建时分配,进程结束时释放,只能被一个进程使用
PGA包括了以下几个结构:
()排序区
()游标状态区
()会话信息区
()堆栈区
由参数:pga_aggregate_target 决定
3.几类进程:用户进程,服务器进程,后台进程,其它可选进程
用户进程
在用户连接数据库产生,请求oracle服务器连接,必须要先建立一个连接,不会直接和oracle服务器连接
服务器进程
当连接实例并建立用户会话时产生,独立服务器或者提供共享服务器都能产生
后台进程
维持物理和内存之间的联系,用来管理数据库的读写,恢复和监视等工作。
Server Process主要是通过他和user process进行联系和沟通,并由他和user process进行数据的交换。
在Unix机器上,Oracle后台进程相对于操作系统进程,也就是说,一个Oracle后台进程将启动一个操作
系统进程。
在Windows机器上,Oracle后台进程相对于操作系统线程,打开任务管理器,我们只能看到一个
ORACLE.EXE的进程,但是通过另外的工具,就可以看到包含在这里进程中的线程。
必须要有的后台进程
DBWn –>数据库写进程
PMON –>程序监控进程
ON –>系统监控进程
LGWr –>日志写进程
CKPT –>检查点进程
可选进程:
ARCN 归档进程
RECO
Snnn
pnnn
DBWn(数据库写进程)
负责将修改过的数据块从数据库缓冲区高速缓存写入磁盘上的数据文件中
写入条件:
发生检查点
脏缓存达到限制
没有自由的缓存
超时发生
表空间离线
表空间只读
表被删除或者截断
开始备份表空间
可以修改数据写进程的数量
alter system set db_writer_processes=3 scope=spfile;
PMON(程序监控进程)
清除失效的用户进程,释放用户进程所用的资源。
如PMON将回滚未提交的工作,释放锁,释放分配给失败进程的SGA资源。
清除失败的进程
回滚事务
释放锁
释放其他资源
ON(系统监控进程)
检查数据库的一致性,当启动失败时完成灾难恢复等
实列恢复时,前滚所有重做日志中的文件,打开数据库为了用户能访问,回滚未提交的事务,释放临时表空间
清除临时空间,聚结空闲空间,从不可用的文件中恢复事务的活动,OPS中失败节点的实例恢复
清除OBJ$表
缩减回滚段
使回滚段脱机
LGWr(日志写进程)
将重做日志缓冲区中的更改写入在线重做日志文件
条件:
提交的时候(commit)
redo log buffer达到1/3满
每隔3秒
有大于1MB 重做日志缓冲区未被写入磁盘
DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入
超时
在dbwr进程些之前写日志
CKPT(检查点进程)
DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一致,CKPT进程负责同步数据文件,
日志文件和控制文件
CKPT会更新数据文件/控制文件的头信息
条件:
在日志切换的时候
数据库用immediate ,transaction ,normal选项shutdown数据库的时候
根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来确定
用户触发
ARCN(归档进程)
在每次日志切换时把已满的日志组进行备份或归档
条件:
数据库以归档方式运行的时候
RECO
负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。
RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。
Server Process(服务进程)
分为专用服务进程(Dedicated Server Process)和共享服务进程(MultiTreaded Server Process)
专用服务进程:一个服务进程对应多个用户进程,轮流为用户进程服务。
用户进程(User Process)、服务进程(Server Process)、后台进程(Background Processes)的启动
用户进程: 数据库用户请求Oralce server会话时被启动
服务进程:当用户会话启动后,连接到Oracle实例时该进程被启动
后台进程:当Oracle实例被启动时,启动相关的后台进程
超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了更大池大
你确定每次都关了,仔细检查一下衫毕GetConn()和CloseCn()的亮没代码
像这种循环没必要每次都重新打开敬塌纳一个链接的,太浪费资源了
肯定是没有关闭没有必要的接接,在连接过燃枣多的时候就会使数据库服务器崩掉,一般是在用DataReader时发生,在孝斗使用DataSet时不会,DataSet是自动开关数据连接皮慎拆,如果手动打开的话,则必须手动关闭,以免发生相同的错误
常用的数据库连接池
常用的数据库连接池有以下几种:
1.基于JNDI 、C0 、DBCP技术的数据连接池
(1)JNDI(Java Naming and Directory Interface ):是SUN公司提供的一种标准的Java命名系统接口,是一组在Java应用中访问命名和目录服务的API。命名服务是将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,它提供了应用编程接口(application
programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI
SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI
SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。
(2)C0:连接池作者是《星球大战》迷,C0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。
(3)DBCP(DataBase connection pool):是 apache 上的一个 java 连接池项目,也是 tomcat
使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar
(4)JDBC(Java DataBase
)是Java与数据库的接口规范,JDBC定义了一个支持标准SQL功能的通用低层的应用程序编程接口(API),它由Java
语言编写的类和接口组成,旨在让各数据库开发商为Java程序员提供标准的数据库API。 JDBC
API定义了若干Java中的类,表示数据库连接、SQL指令、结果集、数据库元数据等。它允许Java程序员发送SQL指令并处理结果。通过驱动程序管理器,JDBC
API可利用不同的驱动程序连接不同的数据库系统。
(5)ODBC(Open DataBase
)是微软倡导的、当前被业界广泛接受的、用于数据库访问的应用程序编程接口(API),它以X/Open和
ISO/IEC的调用级接口(CLI)规范为基础,并使用结构化查询语言(SQL)作为其数据库访问语言。 ODBC总体结构有四个组件:
区别和联系:
JDBC与ODBC都是基于X/Open的SQL调用级接口,
JDBC的设计在思想上沿袭了ODBC,同时在其主要抽象和SQL
CLI实现上也沿袭了ODBC,这使得JDBC容易被接受。JDBC的总体结构类似于ODBC,也有四个组件:应用程序、驱动程序管理器、驱动程序和数据源。
JDBC保持了ODBC的基本特性,也独立于特定数据库。
关于数据库大池案例的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
香港服务器首选后浪云,2H2G首月10元开通。
后浪云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。