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 支持.