请关掉你的数据库连接!并且请使用数据库连接池
那看上去也许是一个即简单又很明显的规则,然而,确保你的数据库连接被以适时的方式关闭对保护你的数据库性能和可利用性有很大帮助。在下面这些技巧的帮助下你可以很好地关闭你的数据库连接。
一个智者曾说过,“如果你打开了一个资源使用时,请在你使用好的时候确保你关上了它”。
注意,他没这样说,“当你打开一个资源使用时,请在你使用好时确保你关上了它,如果你不关上它,一点问题也没有,你正在使用的库/驱动/运行时间最终会自动关上它”。
如果每次我看见资源被打开使用而使用完以后又认为它关闭了或最终超时关闭时都有5分钱的话,我会成为一个富有的人。没有比数据库连接更严重的例子了。
我们都会对那样做感到内疚,但是不恰当地关闭数据库连接带来的负面效果会在你没预料到或者意想不到的情况下被强烈的感觉到。在你最新发布的产品系统里恰好一切都会发出嗡嗡的响声直到不久的将来某时你的客户惊慌失措地给你打了个电话,他(她)想知道为什么他们的应用程序或者系统不再工作了。或者,更糟糕的是,这个问题会断断续续地发生,一些用户可以用这个系统,而另一些用户却用不了。
不过,还是有好消息的。这些各种各样的问题可以用一点预见和纪律来解决。
连接池的规则
只要有可能,不要依靠你数据库本身的初始连接资源。这些初始连接资源通常是在数据库本身配置好的,不要为不同的客户端去很好地扩展它们或者很好地配置它们,在多企业架构的状况下这种做法很痛苦。
数据库连接池最大的优点在于它能合理安排数据库连接(这样一来数据库连接资源就可以来做更重要的事情像查询和提供数据)和它能设置一个你的应用程序可以获得的可配置的数据库最大连接数。
你没理由不使用一个数据库连接池。
另外,连接池的作用就是为了提高性能。
连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。
基本原理是这样的:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
1.连接池的概念和为什么要使用连接池?
连接池放了N个Connection对象,本质上放在内存当中,在内存中划出一块缓存对象,应用程序每次从池里获得Connection对象,而不是直接从数据里获得,这样不占用服务器的内存资源。
2.如果不使用连接池会出现的情况:
a.占用服务器的内存资源
b.导致服务器的速度非常慢
3.应用连接池的三种方式:
a.自定义连接池
b.使用第三方连接池
c.使用服务器自带的连接池
连接池一般比直接连接更有优越性,因为它提高了性能的同时还保存了宝贵的资源。在整个应用程序的使用过程,当中重复的打开直接连接将导致性能的下降。而池连接只在服务器启动时打开一次,从而消除了这种性能问题。
连接池主要考虑的是性能,每次获取连接和释放连接都有很大的工作量,会对性能有很大影响;而对资源来说起的是反作用,因为保存一定数量的连接是要消耗内存的。应用程序每次从池里获得Connection对象,而不是直接从数据里获得,这样不占用服务器的内存资源。所以一般要建立连接池,而连接的数量要适当,不能太大,太大会过多消耗资源。(所以,考虑2个方面,一个是内存,另一个是资源)。
连接池就是为了避免重复多次的打开数据库连接而造成的性能的下降和系统资源的浪费。
当你写完打开的数据库资源时请关上它
#p#分页标题#e#
当你第一次写数据库对象打开命令时,干脆直接在connection.open()代码下面几行写上connection.close()(这有点好笑),然后再在connection.open()和connection.close()之间写其他的代码。这样,你就会被迫去看到connection.close()和记得关闭数据库连接。
异常的时候
当处理资源时,使用try/catch异常处理块是常用的模式。数据库连接就不同了。你不可能总是知道什么时候或者什么地方你的代码就出现了问题,但是你仍然应该为它做好准备。
确保在恰当的catch代码块里释放你任何潜在地打开的连接。在你想关闭连接之前首先去检查一下你是否有一个有效的连接被打开也是一个好主意,这样以免引起其他的异常!
测试,诊断,故障排除
大多数的关系型数据库系统都有帮助你检查它正在使用的连接是否被你的代码正确关闭的能力。例如,在MySQL数据库里,你需要做的是以管理员的身份(或者有适合权限的用户)通过在命令行(或者你喜欢的数据库客户端)输入命令的方式来连接到数据库服务器,
…通过在命令行输入SHOWPROCESSLIST显示如下的信息:
从这个信息列表里,我们可以快速地知道并不是所有的连接都被恰当地关闭了。
我常常惊讶我所遇到的很多开发人员没有意识到这个命令,或者至少知道这个命令的。我们要知道它,我们要使用它,并且我们要爱上它!
小编结语:
虽然数据库在管理这些数据库连接时越来越好也越来越智能,这也许是正确的,但是这不能成为我们变懒的借口,因此不要认为没事就跳过这些技巧。要知道在开发界内存泄漏是重大的灾难。
通过确保总是有足够的连接可以被服务请求所用可以取悦你的客户。并且同时通过保持一个最小的打开连接数,这也有助于改善你数据库的性能。
所以,记住要关闭这些打开的数据库连接!