由于DataSource对象是由Tomcat提供的,因此不能够在程序中创建一个DataSource对象,而要采用JNDI技术来获得DataSource对象的引用。
可以简单的把JNDI理解为一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑定,外部程序可以通过名字来获得某个对象的引用。在javax.naming包中提供了Context接口,该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。
Context接口方法
方 法 描 述 bind(String name,Object obj) 将对象与一个名字绑定 lookup(String name) 返回与指定的名字绑定的对象Tomcat把DataSource作为一种可配置的JNDI资源来处理。生成DataSource对象的工厂org.apache.commons.dbcp.BasicDataSourceFactory。
<Resource>元素用来定义JNDI Resource。例如:
<Context reloadable="true" > <Resource name="jdbc/ DBname " auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="123" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ DBname?autoReconnect=true" /> </Context>
<Resource>元素的属性说明:
Name:指定Resource资源的JNDI名称;
auth:可选填Container或Application,指定Resource的管理者;
type:指定Resource资源的Java类名;
maxActive:设置数据库连接池中活动状态连接的最大数目,为0则不受限制;
maxIdle:设置数据库连接池中空闲状态连接的最大数目,为0则不受限制;
maxWait:设置数据库连接池中空闲状态连接的最长等待时间,超时则抛出异常,为-1则可无限等待;
username:指定数据库的用户名;
password:指定连接数据库的密码;
driverClassName:指定数据库的JDBC驱动器的Driver实现类名字(这里为MySQL数据库连接);
url:连接数据库的url。
注:可在<CATALINA_HOME>/conf/server.xml 文件中的对应<Host>元素中如上配置<Resource>子元素以供Tomcat容器内的多个Web应用使用。
配置JNDI资源引用web.xml:
Java Web应用中要使用JNDI资源,必须在web.xml中配置对该JNDI资源的引用<resource-ref>元素。内容如下:
<web-app> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/DBname </res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
<resource-ref>元素的子元素说明:
description:对所引用JNDI资源的描述;
res-ref-name:引用的JNDI资源的名称,与上面<Resource>元素中的name属性一致;
res-type:引用的JNDI资源的类名称,与上面<Resource>元素中的type属性一致;
res-auth:引用资源的管理者,上面<Resource>元素中的auth属性一致;
使用相对简单些的JNDI资源访问方式lookup方法,如下:
Context sourceCtx = new InitialContext(); DataSource ds = (DataSource) sourceCtx.lookup("java:comp/env/jdbc/ DBname "); conn = ds.getConnection();