JDBC连接数据库的两种方式
1.在代码中使用DriverManager获得数据库连接。这种方式效率低,并 且其性能、可靠性和稳定性随着用户访问量得增加逐渐下降。
2.使用配置数据源的方式连接数据库,该方式其实质就是在上述方法的基础上增加了数据库连接池,这种方式效率高。
数据源连接池的方式连接数据库与在代码中使用DriverManager获得数据库连接存在如下差别:
1)数据源连接池的方式连接数据库是在程序中,通过向一个JNDI(Java Naming and Directory Interface)服务器查询,即调用Context接口的lookup()方法,来得到DataSource对象,然后调用DataSource对象的getConnection()方法建立连接
2)为了能重复利用数据库连接对象,提高对请求的响应时间和服务器的性能,采用连接池技术.连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成时,客户程序调用close()方法,将连接对象放回池中.
3)在代码中使用DriverManager获得数据库连接的方式中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对象之间的联系.
数据源与连接池
采用JDBC连接数据库,每次访问前都要先建立与数据库的连接。为了免去每次访问数据库之前建立数据库连接的开销,提高访问数据库效率,引入了数据源技术。该技术是把预先建立好的数据库连接保存在连接池中,由连接池管理这些数据库连接。需要访问数据库时,只需从连接池中取出空闲状态的数据库连接,访问结束时,释放连接到连接池中。
使用步骤(SQLServer):
一 配置数据源
1.在服务器上添加SQLServer数据库驱动程序,把JDBC驱动程序复制到Tomcat安装目录下的lib目录。
2.数据源参数配置。可将数据源配置到Tomcat安装目录下的conf\server.xml文件中,也可配置到Web工程目录下的META-INF\context.xml文件中。为了提高项目的可移植性,建议采用后者,若Web工程目录下的META-INF中不存在context.xml文件,则需自建该文件。
配置数据源的具体代码如下:
<Context>
<Resource name="jdbc/sqlserver"
auth="Container"
type="javax.sql.DataSource"
maxActive="4"
maxIdle="2"
maxWait="6000"
username="sa"
password="123456"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=p"/>
</Context>
3.在web工程目录下的web.xml的根节点下配置如下内容:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/sqlserver</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
二 使用连接池技术访问数据库
使用数据源对象:
1.获得对数据源的引用。
Context ctx=new InitalContext();
(DataSourse)ctx.lookup("java:comp/env/jdbc/sqlserver");
2.获得数据库连接对象
Connection conn=ds.getConnection();
3.返回数据库连接到连接池
con.close();
示例(SQLServer):
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<html>
<head>
<title>信息查看页面</title>
</head>
<body>
<center>
<% DataSource ds=null; //通过连接池连接数据库
InitialContext ctx=new InitialContext();
ds=(DataSource)ctx.lookup("java:comp/env/jdbc/sqlserver");
Connection conn=ds.getConnection(); //通过连接池连接数据库
PreparedStatement pstmt=conn.prepareStatement("select * from Student");
ResultSet rs=pstmt.executeQuery();
%>
<table border="2" bgcolor="ccceee" width="650">
<tr bgcolor="CCCCCC" align="center">
<td>记录条数</td><td>学号</td><td>姓名</td>
<td>性别</td><td>年龄</td><td>专业</td>
</tr>
<%
while(rs.next()){
%>
<tr align="center">
<td><%=rs.getRow()%></td>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
<td><%=rs.getString(3)%></td>
<td><%=rs.getString(4)%></td>
<td><%=rs.getString(5)%></td>
</tr>
<%}%>
</center>
<%if(rs!=null){rs.close();}
if(pstmt!=null){pstmt.close();}
if(conn!=null){conn.close();}
%>
</table>
</body>
</html>