什么是数据库连接

什么是数据库连接,第1张

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库 *** 作的性能。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

1)最小连接数

是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

2)最大连接数

是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库 *** 作。

3)如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

最近做的一个JavaWeb项目,持久层用SpringJDBC+DBCP+MySQL。一开始只配置了DBCP的一些常用参数,没有注意对空闲连接的检查和回收。项目部署在tomcat后,刚开始使用没用问题。第二天再试图登录时,发生了报错:

可以看到,报错信息提示上次交互已经是82664635ms前,超过了MySQL server配置的'wait_timeout'(默认是8小时),所以该连接已经被MySQL回收了,但DBCP不知道连接已被回收,依然试图执行 *** 作,引发了异常。报错信息提示可以修改wait_timeout或者添加autoReconnect=true。

(备注:mysql5以上的,设置autoReconnect=true 是无效的 只有4x版本,起作用)

这两个参数的默认值是8小时(60 60 8=28800)。 注意:wait_timeout的最大值只允许2147483 (24天左右)

也可以用MySQL命令进行修改

这种办法治标不治本。

2减少连接池内连接的生存周期,使之小于上一项中所设置的wait_timeout 的值。

也就是说,让已经断开的空闲连接没有机会被使用,提前被回收。

以C3P0配置为例:

DBCP中配置minEvictableIdleTimeMillis即可。

3配置连接池

定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。并且每次使用连接前检查连接是否可用,定期回收空闲的连接。

修改 c3p0 的配置文件,在 Spring 的配置文件中设置:

DBCP连接池的配置:

DBCP官方配置文档: >

关闭数据库连接 readtimeout 的具体方法可以因不同数据库而异。如果您使用的是 MySQL 数据库,您可以尝试以下方法:

1 登录到 MySQL 数据库的客户端。

2 执行 SHOW VARIABLES LIKE 'connect_timeout' 来检查当前连接超时设置的时间,如果需要更改,您可以执行 SET GLOBAL connect_timeout=30; 来将连接超时时间设置为 30 秒(可根据实际情况进行更改)。

3 执行 SHOW VARIABLES LIKE 'wait_timeout' 来检查当前等待连接超时设置的时间,如果需要更改,您可以执行 SET GLOBAL wait_timeout=28800; 将等待连接的超时时间设置为 8 小时(可根据实际情况进行更改)。

4 关闭数据库连接的具体方法可以因实现方式而异,但一般建议在使用完数据库连接后,及时将其关闭。您可以在代码中使用 close() 方法来手动关闭数据库连接,或者使用 try-with-resources 语句块,在语句块结束后自动关闭数据库连接。

请注意,关闭数据库连接需要遵循一定的约定和规则,否则可能导致未正常释放资源和造成内存泄漏等问题。因此,在进行关闭 *** 作时,建议您参考数据库文档和开发规范,并遵循最佳实践进行 *** 作。

听说默认的不使用超时是30分钟,失效超时是0,就是无效。那么默认就是30分钟会降低到连接池的最小值。如果设置了失效超时,那么连接达到失效超时那么久的未活动的时候,就会强行从数据库断开,无论目前是空闲还是被应用拿着,甚至连接池会降低到连接最小数一下,有时在监控中看到free

pool为负数可能就是和这个有关。好处是防止连接泄露,和数据库网络故障导致的连接不可用。

Druid连接池及监控在Spring配置如下:

[html] view plaincopy

<bean id="dataSource" class="comalibabadruidpoolDruidDataSource" init-method="init" destroy-method="close">

<!-- 基本属性 url、user、password -->

<property name="url" value="${jdbc_url}" />

<property name="username" value="${jdbc_user}" />

<property name="password" value="${jdbc_password}" />

<!-- 配置初始化大小、最小、最大 -->

<property name="initialSize" value="1" />

<property name="minIdle" value="1" />

<property name="maxActive" value="20" />

<!-- 配置获取连接等待超时的时间 -->

<property name="maxWait" value="60000" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->

<property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->

<property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="SELECT 'x'" />

<property name="testWhileIdle" value="true" />

<property name="testOnBorrow" value="false" />

<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->

<property name="poolPreparedStatements" value="true" />

<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

<!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->

<property name="filters" value="stat" />

</bean>

2 只要配置initialSize,maxActive就可以,目前这样的配置已经能够使用连接池,加入其实配置性能不好,官方文档里也不没加其它属性,连接池jar包免费下载。

对查询中经常作为查询条件的字段增加索引,比如说

select  from table1 where name like 'xxx' and create_time > '2013-06-01'

这里就可以为name 和 create_time分别创建索引;

ALTER TABLE table1 ADD INDEX `ind_CreateTime` (`create_time`);

ALTER TABLE table1 ADD INDEX `ind_name` (`name`);

2 优化导致慢查询的SQL语句。可以将一条查询分解为多条小范围的查询,将结果union在一起。尽量减少在where 条件中使用 like or between等运算符

以上就是关于什么是数据库连接全部的内容,包括:什么是数据库连接、解决MySQL8小时自动断开连接的问题(DBCP配置)、关闭数据库连接readtimeout等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9713948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存