对数据库连接池的理解
一、先说一下我们最初连接数据库的过程
1.一般来说,Java应用程序连接数据库需要经过以下几个过程:
1).加载数据库驱动
Class.forName("com.mysql.jdbc.Driver") ;
2).通过JDBC建立数据库连接
Connection con =DriverManager.getConnection(url , username , password ) ;
3).创建状态(创建一个statement)
Statement stmt = con.createStatement() ;
或者
PreparedStatement pstmt = con.prepareStatement(sql) ;
4).访问数据库,执行SQL语句
ResultSetrs = stmt.executeQuery("SELECT * FROM ...") ;
5).断开数据库连接
result.close();
state.close();
con.close();
2.对于上述过程,在开发过程中会存在很多问题:
首先,每次web请求都要建立一次数据库连接,而建立连接是一个很费时的活动,而且系统还需要分配内存资源。这种一次或多次访问数据库的操作,对于系统或许感觉不到有多大的开销。可是对于现在的web应用,尤其是大型的电子商务网站,有几百人或几千人同时在线是很正常的事情。在这种情况下,频繁的对数据库进行操作势必会占用很多的系统资源,网站响应速度也会下降,严重的甚至会造成服务器的崩溃。
其次,对于每一次的数据库连接,使用完后都要断开,否则,如果应用程序因为异常而无法关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。
还有就是,这种开发不能控制被创建的连接对象数,系统资源会毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,甚至是服务器崩溃。
3.通过上面的分析,我们会发现“数据库连接”是一种稀缺的资源,为了保证网站的正常使用,我们要对其进行妥善的管理。因此,我们可以想一下,如果我们操作完数据库后,不关闭连接,而是暂时存放起来,当别人使用的时候,把这个连接给他们使用,就避免了一次建立数据库连接和断开的操作时间消耗。原理如下:
二、数据库连接池的原理
由上面的分析可以看出,问题根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个跟著名的设计模式:资源池(Resource Pool)。该模式就是为了解决资源的频繁分配、释放所造成的问题。为了解决上述问题可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设置连接池的最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接数量、使用情况,为系统开发、测试及性能调整提供依据。
这就是数据库连接池的原理,它大大提高了数据库连接的利用率,减小了内存吞吐的开销。我们在开发的过程中就不用考虑数据库连接的问题,自然有数据库连接池帮我们处理。但是连接池要考虑的问题不仅仅如此。还要考虑以下问题:
1) 并发问题
2) 多数据库服务器和多用户
3) 事务处理
4) 连接池的分配与释放
5) 连接池的配置和维护
在实际开发中有好多成熟的开源连接池可以使用,没必要什么都重头写一遍,只要理解其原理即可,比较流行的性能优良的第三方数据库连接池jar包:
1. Apache commons-dbcp 连接池
下载:http://commons.apache.org/proper/commons-dbcp/
2. c3p0 数据库连接池
下载:http://sourceforge.net/projects/c3p0/
3. 阿里的 druid 连接池
下载:http://repo1.maven.org/maven2/com/alibaba/druid/
文中部分引用来自博客:http://blog.youkuaiyun.com/shuaihj