0 JNDI简介:
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
1 : tomcat内配置数据源
tomcat数据源的配置是通过JNDI方式,可以启动tomcat,访问地址:
http://localhost:8080/docs/jndi-resources-howto.html
找到如下位置来参考配置:
JDBC Data Sources 0. Introducation ........ 4. Configure Tomcat's Resource Factory 配置tomcat数据源工厂 To configure Tomcat's resource factory, add an element like this to the <Context> element for the web application. <Context ...> ... <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="dbusername" password="dbpassword" driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" maxActive="8" maxIdle="4"/> ... </Context>
tomcat创建好数据源对象后,会将此对象放在tomcat容器中(JNDI容器),对象的名称是通过Resource name="jdbc/EmployeeDB"中的name属性配置,那么应用程序就可以通过name属性获取到。
获取写法见:
3. Code Your Application's Use Of This Resource A typical use of this resource reference might look like this: Context initCtx = new InitialContext(); // 初始化环境 Context envCtx = (Context) initCtx.lookup("java:comp/env");//检索出保存数据源的容器,固定写法 DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");//从容器中获取配置的数据源对象 Connection conn = ds.getConnection(); // 获取数据库连接 ... use this connection to access the database ...//使用连接下执行和数据库相关操作 conn.close(); // 关闭数据库连接
context.xml配置代码:
可以写在tomcat的context.xml内配置,这样配置完之后提供的是全局范围内可访问,如果tomcat/webapps内配置多个web工程,均可以访问(类比于全局变量)
或者在web项目的META-IN内写,这样配置后,只能是本web工程可访问(类比于局部变量)
context.xml内容:
<Context> <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/jdbc" maxActive="8" maxIdle="4"/> </Context>
java获取jndi配置数据源代码如下:
try{ Context initCtx = new InitialContext(); //初始化jndi Context envCtx = (Context) initCtx.lookup("java:comp/env"); // 检索出jndi容器 DataSource ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB"); //从jndi容器中检索出对象 Connection conn = ds.getConnection();// 返回 conn的代理对象 String sql = "insert into student(name) values('bb')"; PreparedStatement st = conn.prepareStatement(sql); st.executeUpdate(); st.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); }
2 注意事项:
使用tomcat数据源,必须要把数据库的驱动jar包放在tomcat的lib中,因为我们通过tomcat创建数据库连接池,需要加载数据库连接驱动,而tomcat加载驱动只会去tomcat自身的lib内找
3 tomcat默认数据源dbcp一些说明:
tomcat默认数据源为dbcp,查看lib下可找到tomcat-dbcp.jar 这个包,
上一篇文章介绍jdcp数据源时,引用的包为 Commons-dbcp.jar 和 Commons-pool.jar,
那么tomcat-dbcp.jar与commons-dbcp.jar区别在哪里:
1 tomcat-dbcp 包括了 pool的功能.但是Common-DBCP没有 它要加上common-pool才能实行 pool 的功能.
2 Common-DBCP 不支持 jnid ,tomcat-dbcp 支持.