在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用Tomcat服务器创建好的数据库连接池即可。要想让Tomcat服务器在启动的时候帮我们创建一个数据库连接池,那么需要简单配置一下Tomcat服务器。
JNDI技术简介
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
查看Tomcat帮助文档得知 它的jndi配置如下
<Context>
<Resource name="jdbc/datasource" auth="Container"
type="javax.sql.DataSource" username="root" password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/weblib"
maxActive="8" maxIdle="4"/>
</Context>
j2ee开发中服务器2各种创建资源方式
- 第一种是通过方法参数的形式传递进来,比如我们在Servlet中写的doPost和doGet方法中使用到的request对象和response对象就是服务器以参数的形式传递给我们的
- 第二种就是JNDI的方式,服务器把创建好的资源绑定到JNDI容器中去,应用程序想要使用资源时,就直接从JNDI容器中获取相应的资源即可
对于上面的配置文件可以这么拿取
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/datasource");
记得引入数据库驱动jar包到lib 中,其次配置context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/datasource"
auth="Container"
type="javax.sql.DataSource"
username="root"
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/libweb"
maxActive="8"
maxIdle="4"/>
</Context>
在获取数据库连接的工具类(如DBUtil4)的静态代码块中获取JNDI容器中的数据 源
package dbex;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBUtil4 {
private static DataSource ds = null; // 所有的数据连接池 接口 java.sql.DataSource
static{
try {
// 初始化JNDI
Context initCtx = new InitialContext();
// 得到JNDI容器
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// 从JNDI容器中检索name为jdbc/datasource的数据源
ds = (DataSource) envCtx.lookup("jdbc/datasource");
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/**
*
* @Title: geteConnection
* @Description: 获取数据库连接
* @param @return
* @param @throws SQLException
* @throws
*/
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
/**
*
* @Title: release
* @Description:释放资源
* @param
* @throws
*/
public static void release(Connection conn,PreparedStatement ppst,ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ppst!=null){
try {
ppst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
最后我们来写一个Servlet测试 把我们查出来的数据通过浏览器页面显示出来
package dbex.server;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dbex.DBUtil3;
import dbex.DBUtil4;
/***
*
* @ClassName: JNDISer
* @Description: 测试tomcat数据源
* @author penny
* @date 2017年12月3日 上午2:01:19
*
*/
public class JNDIServ extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
Connection conn=null;
PreparedStatement ppst =null;
ResultSet rs= null;
try {
conn =DBUtil4.getConnection();
out.println(conn);
ppst = conn.prepareStatement("select * from user");
rs=ppst.executeQuery();
while(rs.next()){
out.println(rs.getInt(1)+" "+rs.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
}
DBUtil4.release(conn, ppst, rs);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
最终效果
web.xml 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>JNDI</servlet-name>
<servlet-class>dbex.server.JNDIServ</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JNDI</servlet-name>
<url-pattern>/jndi</url-pattern>
</servlet-mapping>
</web-app>