数据库连接池

来源:互联网 发布:网络公关公司 编辑:程序博客网 时间:2024/05/05 03:25

数据库连接

传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。

 

数据库连接池原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。


商业性的项目一般都会使用连接池,这样就避免了IO操作,提高效率。连接池的产品不必我们去具体实现,成熟的产品已经有了很多。我们用的Tomcat集成的一个数据库连接池是apache commons dbcp

下面是一个测试数据库连接池的例子(Testdbcp.jsp)

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><%@ page import="javax.naming.*" %>  <%@ page import="javax.sql.*" %>  <%@ page import="java.sql.*" %><%Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try { Context ctx = new InitialContext();//通过JNDI查找DataSource DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/drp"); conn = ds.getConnection(); pstmt = conn.prepareStatement("select * from t_user"); rs = pstmt.executeQuery(); while (rs.next()) { out.println(rs.getString("user_id") + ", " + rs.getString("user_name")); }}catch(Exception e) {e.printStackTrace();}finally {if (rs != null) {rs.close();}if (pstmt != null) {pstmt.close();}if (conn != null) {//将Connection放到连接池中conn.close(); }}%>

数据库连接池的实现是将连接绑定在JNDI树上,利用DataSource在JNDI树上进行查找。关于JNDI更多细节知识也不是很熟悉,在以后的学习过程中会继续深入学习。下图是如何将对象绑定到JNDI树上。



我对数据库连接池的简单理解,通过连接池我们可以把建立数据库的连接提前放置在连接池中,当需要对数据库进行操作,只需要在连接池中获取连接,而不用在手动与数据库建立连接。大批量访问数据库的时候,就不会因数据库连接过大而导致异常。但是这样做的话应该也存在线程安全的问题吧?还没想通呢...有懂得说一下啊...

原创粉丝点击