<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/testDB?createDatabaseIfNotExist=true&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useServerPrepStmts=false&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull" />
<property name="username" value="root" />
<property name="password" value="123456" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="1" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="5000" />
我这里设置最大使用连接数为1个,然后项目正常启动,我使用张三用户登录成功,不退出登录,然后使用李四这个账号登录系统,也可以正常登录--->这其实是可以理解的,连接池里面的最大连接数设置为1是指同一时间点数据库连接最大只有一个,刚才的情况是张三登录后,其实这个数据库连接他就没有使用了,李四再来登录,当然可以拿到这个连接。
我们可以来模拟一个问题现象:在一个事务里面打断点,那么这个断点就会一直占用一个连接,不会释放,直到事务执行完毕。
我在更新用户资料功能模块【有用到事务】那里打一个断点,我使用张三登录后,点击更新用户资料按钮,然后在断点处程序一直卡住,注意这个时候数据库连接是不会释放的,因为事务还没完。
我又使用李四账号登录,直接登录不上去...因为获取不到数据库连接了...
initialSize 初始化连接数目
maxActive 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接。一般把maxActive设置成可能的并发量就行了设 0 为没有限制
maxIdle 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。
minIdle 连接池中最小空闲连接数,当连接数少于此值时,连接池会创建连接来补充到该值的数量
maxWait 连接池中连接用完时,新的请求等待时间,毫秒,这里取值-1,表示无限等待,直到超时为止,也可取值9000,表示9秒后超时。超过时间会出错误信息
removeAbandonedTimeout 活动连接的最大空闲时间,单位为秒 超过此时间的连接会被释放到连接池中,针对未被close的活动连接
removeAbandoned 是否清除已经超过“removeAbandonedTimout”设置的无效连接。如果值为“true”则超过“removeAbandonedTimout”设置的无效连接将会被清除。设置此属性可以从那些没有合适关闭连接的程序中恢复数据库的连接
minEvictableIdleTimeMillis 连接池中连接可空闲的时间,单位为毫秒 针对连接池中的连接对象
timeBetweenEvictionRunsMillis / minEvictableIdleTimeMillis 每timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止.
举一个例子说明连接池的运用
假设设置了最小、最大连接数,分别是10、20。那么应用一旦启动则首先打开10个数据库连接,但注意此时数据库连接池的正在使用数字为0,因为你并没有使用这个连接,空闲的数量则是10.
然后你开始登陆,假设登陆代码使用了一个连接进行查询,那么此时数据库连接池的正在使用的数量为1,空闲数量为9.这并不需要从数据库打开连接,因为连接池已经准备好了10个给你留着呢。
登陆结束了,当前连接池的数量是多少呢?当然是0,因为那个连接随着事务的结束已经返回给连接池了。
然后同时有11个人在同时进行登陆,会发现什么呢?连接池从数据库新申请一个连接,连同另外的10个一并送出,这个瞬间连接池的使用数是11个,不过没关系正常情况下过一会又会变成0。
如果同时有21个人登陆呢?那第21个人就只能等前面的某个人登陆完毕后释放连接给他。 这时候连接池开启了20个数据库连接,虽然很可能正在使用的数量已经降为0,那么20个连接会一直保持吗?
当然不会,连接池会在一点时间内关闭一定量的连接还给数据库,在这个例子里数字就是 20 -10 =10,因为只需要保持最小连接数就好了。而这个时间周期也是连接池里配置的。