Servlet容器对它提供的数据源javax.sql.DataSource对象使用了JNDI技术绑定了一个name值。
servlet容器中的JNDI:在javax.naming包中提供了Context接口,它有bind(String name,Object object)和lookup(String name)两个方法来绑定和获得对象。servlet容器把DataSource作为一种资源来处理,生成DataSource的工厂为org.apache.commons.dbcp.BasicDataSourceFactory.
知道了servlet容器怎么提供数据源对象后,要如何使用??
1.首先,配置数据源。在META-INF中配置context.xml。
<Context reloadable="true" >
<Resource name="指定要绑定的名字" auth="指定有谁来管理(Container或Application)" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="dbuser" password="1234"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/BookDB?useUnicode=true&characterEncoding=GB2312"/>
</Context>
maxActive和maxIdle分别指定活动和空闲状态的连接的数目。maxWait指定空闲的最大时长。
2.在web.xml中配置<resource-ref>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/BookDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3.在java程序中访问数据源
Context ctx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)enctx.lookup(JNDI中绑定的name值);
Conntection con = ds.getConnection();
....
另:加了java:comp/env则需要在web.xml中配置<resource-ref>元素。 java:comp/env是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有:
---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
---------JMS 连接工厂在java:comp/env/jms 子上下文中声明
---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
---------URL 连接工厂在 java:comp/env/url子上下文中声明
还有,注意要把数据库驱动器的jar包放在tomcat下的lib中