1 数据源操作原理
原理:在一个对象池中保存多个数据库的连接,以后再进行数据库操作时,直接从连接池中取出一个数据库连接;
当数据库操作完成后,再将此连接放回到数据库的连接池中,等待其他用户继续使用;
在这过程中,有以下问题:
a 最小连接数:如果一个程序在使用时没有一个用户连接,则数据库最小应该维持的数据库连接数;
b 最大连接数:在一个程序中一个数据库最多可以打开的数据库连接数;
c 最大等待时间:当一个数据库连接池中已经没有更多的数据库连接提供给用户使用时,其它用户等待得最大时间;
如果在等待时间内有连接放回,则可以继续使用;如果超过了最大等待时间,则用户无法取得数据库连接;
2 在Tomcat中使用数据连接池
在Web容器中,数据库的连接池都是通过数据源(javax.sql.DataSource)访问的;
既可以通过javax.sql.DataSource类取得一个Connection对象,但要想得到一个DataSource对象需要使用JNDI进行查找;
JNDI是JavaEE提供的一个服务,其服务的主要功能就是通过一个名称为“key”查找到一个对应的“value”;
这一设计也体现出了Java程序的设计理念,通过key对应的value,只要key不改变,则value可以随意修改;
以上可以看出,客户端通过查询JNDI上所绑定的名称取得一个DataSource对象,并且通过DataSource取得Connection Pool中保存的一个数据库连接;
数据源连接池是在Tomcat上配置的,一定要将驱动程序复制到lib文件夹中;
server.xml : 在server.xml文件中配置数据库连接池
<Context path="/shi" docBase="D:\javaweb" reloadable="true"> <Manager className="org.apache.catalina.session.PersistentManager"> debug=0 saveOnRestart="true" maxActiveSession="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="d:\temp"/> </Manager> <Resource name="jdbc/shi" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="123456" driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost:3306/shi"/> </Context>
<Context>节点中增加了一个<Resource>的节点,用来表示配置的连接池选项;
其中name属性指定的是此数据源的名称,此名称也是以后程序中访问数据库资源时要查找的名称;
在<Resource>节点中的auth选项表示的是连接数据库的方法,有以下两种选择方式:
Container : 容器将代表应用程序登录到资源管理器,一般使用此方式;
Application : 应用程序必须程序化地登录到资源管理器;
以上配置是MySql数据库的驱动程序,如果要使用Oracle,则只需要替换相关的属性内容即可;
配置Oracle连接池:
<Context path="/shi" docBase="D:\javaweb" reloadable="true"> <Manager className="org.apache.catalina.session.PersistentManager"> debug=0 saveOnRestart="true" maxActiveSession="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="d:\temp"/> </Manager> <Resource name="jdbc/shi" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="123456" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:shi"/> </Context>
server.xml配置完成之后就需要在 一个web项目中配置web.xml文件,并在文件中要指明使用的数据库名称;
配置web.xml
<resource-ref> <res-ref-name>jdbc/shi</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
3 查找数据源
数据源的操作使用是JDNI方式进行查找的;
如果使用数据源取得数据库连接,则必须按照如下步骤进行:
a 初始化名称查找上下文:Context ctx=new InitialContext();
b 通过名称查找DataSource对象:DataSource ds = (DataSource)ctx.lookup(JNDI 名称);
c 通过DataSource取得一个数据库连接 : Connect conn = ds.getConnection();
datasource.jsp : 通过数据源取得数据库连接
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="javax.naming.*"%> <%@ page import="javax.sql.*"%> <%@ page import="java.sql.*"%> <html> <head><title>通过数据源取得数据库连接</title></head> <body> <% String DSNAME = "java:comp/env/jdbc/shi" ; // 名称 Context ctx = new InitialContext() ; DataSource ds = (DataSource) ctx.lookup(DSNAME) ; Connection conn = ds.getConnection() ; // 从连接池中取连接 %> <%=conn%> <% conn.close() ; // 表示将连接放回到池之中 %> </body> </html>
以上代码中,虽然真正的server.xml中配置的DataSource名称是“jdbc/shi”,
但是真正使用是却在前面加上了一个“java:comp/env/”的前戳;
实际上这是JavaEE规定的一个环境命名上下文,主要是为解决JNDI查找时的冲突问题;
java:comp/env/环境属性不一定到处都要使用,但对于Tomcat必须设置,否则无法找到;
以上代码直接打印出Connection的连接对象,如果可以取得连接,则会输出一个对象的信息;
如果没有取得,则肯定打印为null;
可以直接将数据源应用到项目中;
例如:DAO开发中经常使用到DatabaseConnection类,就可以将其替换为数据源连接;
修改DAO中的DataConnection.java
package cn.bug.shi.dbc ; import java.sql.* ; import javax.sql.* ; import javax.naming.* ; public class DatabaseConnection { private static final String DSNAME = "java:comp/env/jdbc/shi" ; private Connection conn ; public DatabaseConnection() throws Exception { Context ctx = new InitialContext() ; DataSource ds = (DataSource) ctx.lookup(DSNAME) ; this.conn = ds.getConnection() ; } public Connection getConnection(){ return this.conn ; } public void close() throws Exception { if(this.conn != null){ try{ this.conn.close() ; }catch(Exception e){ throw e ; } } } }
只要数据源的名称不变,则数据库可以任意替换;
在java开发中,都会使用数据路连接池进行数据库的连接操作,这样可以提升操作的性能;