最近在看书,其中有一段是:html
相信有大佬已经能看得出来这是《企业IT架构转型之道》这本书了(这是一本不错的书,推荐工做时长>2年的软件人员能够看看)~~java
对于红色框内的那段文字,我有两个概念不是很明白:mysql
一、应用实例指的是什么?sql
二、链接池是什么?在何时发挥做用?以及何时被配置上?数据库
带着疑问,我查阅了大量的资料,也问了大神,大概弄清楚了。设计模式
应用实例指的是一个应用须要链接数据库的后台(如淘宝后台就是一个应用实例)。tomcat
说到Java中的链接池,咱们不可避免的要说到数据库链接池(connection pool),Java链接池就是数据库链接池在Java上的应用。网络
你们都知道,对于资源共享,有一个颇有名的设计模式-资源池(Resource Pool)。网络上对于资源池的解释是这样的:架构
简言之,链接池是将已经建立好的链接保存在池中,当检测到有请求时,直接使用建立好的链接对数据库进行访问,这样能够节省建立链接和销毁链接所带来的的时间成本。eclipse
在数据库链接池中,涉及到三个主要的参数:
- 最大维持链接数:没有任何请求时在链接池中能够存在的链接数
- 最大链接数:链接池中最多能够存在的链接个数。
- 最大等待时间:当断开链接时,超过最大维持链接数的链接不会立刻销毁,最大等待时间事后它才会销毁。
参数使用的场景实例以下:
当最大维持链接数是10,最大链接数是20,最大等待时间是10000(毫秒)时,
访问数据库,调用链接池的过程是:最开始在链接池中有10个链接(最大链接数),当有用户申请链接时,其将一个链接分配用户,直到链接池中的10个链接全都分配出去。当第11个用户申请链接时,它将建立第11个链接并分配给该用户,直到把第20个链接(最大链接数)分配给第20个用户。
当第21个用户申请链接时,它须要等待,直到前面的20个用户中某一个断开了链接,才会把那个链接分配给第21个用户,当用户断开链接时(第11至20个链接),该链接不会马上被释放而是须要等待10000毫秒(最大等待时间),才被释放,当没有用户链接时,链接池内还保持10个链接。
至此,数据库链接池是什么以及在何时发挥做用基本很清楚了。如今来讨论下他怎么被配置。
在应用的META-INF文件夹下建立一个context.xml配置文件,并在其中添加<Context>标签进行配置,但,这种方式生成的数据源只能用于当前应用。
<?xml version="1.0" encoding="utf-8" ?> <Context> <Resource name="jdbc/EmployeeDB" 当前建立数据链接池的名字,本身定义,在使用jndi容器获取该数据源对象时会用到 auth="Container" 做者 type="javax.sql.DataSource" 对象类型这里固定为DataSource便可 username="dbusername" 数据库链接的用户名 password="dbpassword" 链接密码 driverClassName="com.mysql.jdbc.Driver" 驱动 url="jdbc:mysql:///dbcptest" 数据库的url maxActive="8" DBCP的参数,DBCP的其余参数能够加入 maxIdle="4"/> </Context>
在tomcat启动时,会逐个加载其中的应用,当其加载到当前应用时,会加载到 META-INF文件夹下的 context.xml 配置文件,此时tomcat会根据其中的配置信息为当前应用建立一个数据库链接池,该数据库链接池只能用于当前应用,tomcat下的其余应用没法使用该数据库链接池。
附加:虽然数据库链接池能够帮助咱们节省大量的时间成本,但在开发中,使用链接池时若没有关闭链接(调用链接的close方法)会出现“链接池疲劳的错误”。