名词解释:JNDI的全称是java命名与目录接口(Java Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。我们可以把JNDI简单地理解为是一种将对象和名字绑定的技术,即指定一个资源名称,将该名称与某一资源或服务相关联,当需要访问其他组件和资源时,就需要使用JNDI服务进行定位,应用程序可以通过名字获取对应的对象或服务。

1.context.xml文件设置

  数据源:Tomcat根目录\conf\context.xml文件(没有直接创建也可以)或者在JSP项目WebRoot目录下的META-INF目录中创建一个context.xml文件,添加Context节点,如下:

 <Context>
<Resource name="jdbc/test" auth="Application" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="1234"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.2.254:1433;DatabaseName=test" />
</Context>

name:指定Resource的JNDI名字。

auth:可以写成Container和Application。Container表示由容器创建Resource,Application表示由Web应用创建和管理Resource。

type:指定Resource所属的Java类名。

maxActive:指定数据库连接池中处于活动状态的数据库连接的最大数目。

maxIdle:指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为0表示不受限制。

maxWait:指定数据库连接池中数据库连接处于空闲状态的最长时间(以毫秒为单位),超出这时间将会抛出异常。

username:指定连接数据库的用户名。

password:指定连接数据库的口令。

driverClassName:指定连接数据库的JDBC驱动程序。

url:指定连接数据库的URL。

2.web.xml文件的配置

  在Web应用程序的WEB-INF/web.xml文件中的<web-app>节点下添加<resource-ref>元素,内容如下:

 <web-app>
...
<resource-ref>
<description>news DataSource</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

description:对所引用资源的说明。

res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应。

res-type:指定所引用资源的类名字,与<Resource>元素中的type属性对应。

res-auth:指定管理所引用资源的Manager,与<Resource>元素中的auth属性对应。

3.在Web应用中添加数据库连接jar文件。

4.编写使用数据源和JNDI资源,创建采用数据库连接池Connection对象的SqlHelper.java文件(在helper包中创建的),代码如下:

 package helper;
import java.lang.reflect.*;
import java.sql.*;
import java.util.*; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; public class SqlHelper { private static Connection getConnection() throws ClassNotFoundException,
SQLException {
Connection conn = null;
try {
Context ctx = new InitialContext();
// 获取与逻辑名相关联的数据源对象
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test");
conn = ds.getConnection();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
} public static int executeNonQuery(String cmdText)
throws ClassNotFoundException, SQLException {
int result = -1;
Connection con = null;
PreparedStatement ps = null;
try {
con = getConnection();
ps = con.prepareStatement(cmdText);
result = ps.executeUpdate();
}catch (Exception e) {
System.out.println(e);
} finally {
close(con, ps, null);
}
return result;
} public static int executeScalar(String cmdText) throws SQLException,
ClassNotFoundException {
int result = -1;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getConnection();
ps = con.prepareStatement(cmdText);
rs = ps.executeQuery();
if (rs.next()) {
result = rs.getInt(1);
}
}catch (Exception e) {
System.out.println(e);
} finally {
close(con, ps, rs);
}
return result;
} public static <T> List<T> executeList(Class<T> cls, String cmdText)
throws ClassNotFoundException, SQLException,
InstantiationException, IllegalAccessException {
List<T> list = new ArrayList<T>();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getConnection();
ps = con.prepareStatement(cmdText);
rs = ps.executeQuery();
while (rs.next()) {
T obj = executeResultSet(cls, rs);
list.add(obj);
}
} catch (Exception e) {
System.out.println(e);
}finally {
close(con, ps, rs);
}
return list;
} public static <T> T executeEntity(Class<T> cls, String cmdText)
throws SQLException, ClassNotFoundException,
InstantiationException, IllegalAccessException {
T obj = null;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getConnection();
ps = con.prepareStatement(cmdText);
rs = ps.executeQuery();
while (rs.next()) {
obj = executeResultSet(cls, rs);
break;
}
} catch (Exception e) {
System.out.println(e);
}finally {
close(con, ps, rs);
}
return obj;
} private static <T> T executeResultSet(Class<T> cls, ResultSet rs)
throws InstantiationException, IllegalAccessException, SQLException {
T obj = cls.newInstance();
ResultSetMetaData rsm = rs.getMetaData();
int columnCount = rsm.getColumnCount();
// Field[] fields = cls.getFields();
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
for (int j = 1; j <= columnCount; j++) {
String columnName = rsm.getColumnName(j);
if (fieldName.equalsIgnoreCase(columnName)) {
Object value = rs.getObject(j);
field.setAccessible(true);
field.set(obj, value);
break;
}
}
}
return obj;
} private static void close(Connection con, PreparedStatement ps, ResultSet rs)
throws SQLException {
if (rs != null) {
rs.close();
rs = null;
}
if (ps != null ) {
ps.close();
ps = null;
}
if (con != null) {
con.close();
con = null;
}
}
}

5.搭建entity,dal,bll包。(三层是从net开发转过来的,也可以使用do包,dao包)。

6.JSP页面使用代码如下:

 <%@ page language="java" import="java.util.*,bll.*,entity.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>采用数据源和JNDI资源方式,创建并使用数据库连接池对象访问数据库实例。</title>
</head>
<body>
<div>
<h1>采用数据源和JNDI资源方式,创建并使用数据库连接池对象访问数据库实例。</h1>
<%
List<Student> list = StudentBLL.Select();
for (Student student : list) {
out.println(String.format(
"<ol><li>StudentId:%d</li><li>StudentName:%s</li><li>Phone:%s</li><li>Email:%s</li><li>Address:%s</li></ol>",
student.getStudentId(), student.getStudentName(),
student.getPhone(), student.getEmail(),
student.getAddress()));
}
%>
</div>
</body>
</html>

7.如果Context文件中auth属性设置为:Container,需要将数据库连接的jar文件复制到Tomcat的lib目录下。如果auth属性设置为:Application,则不需要复制到Tomcat的lib目录下。

8.部署运行界面大功告成。

数据源与JNDI资源实现JSP数据库连接池实例的更多相关文章

  1. Python数据库连接池实例——PooledDB

    不用连接池的MySQL连接方法 import MySQLdbconn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='my ...

  2. Python数据库连接池实例——PooledDB

    不用连接池的MySQL连接方法 import MySQLdb conn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='m ...

  3. 简单的数据库连接池实例(java语言)

    1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList  synchro ...

  4. JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术

    本文目录:        1.应用程序直接获取连接的缺点(图解)        2.使用数据库连接池优化程序性能(图解)        3.可扩展增强某个类方法的功能的三种方式        4.自定 ...

  5. glassfish中新建数据源(创建数据库连接池)

    1.浏览器输入:http://localhost:4848 登录glassfish域管理控制台,默认的用户名和密码是amin和adminadmin.(也可以通过NetBeans的服务选项卡--服务器- ...

  6. java web学习总结(十六) -------------------数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  7. JavaWeb学习总结(十三)--数据库连接池

    一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...

  8. javaweb学习总结(三十九)——数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  9. JavaWeb学习(三十)———— 数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

随机推荐

  1. iOS开发-iPad侧边栏Tab选项卡切换

    Android中习惯了叫侧边栏,iOS中如果不习惯侧边栏称呼的话可以叫dock,侧边栏的切换,类似于Android中的底部导航栏的切换,iPad尺寸大了一些,导航的栏目放在侧边会显示的更好耐看一些.选 ...

  2. Oracle中的数值处理方法

    求绝对值函数 ) from dual; 求平方根函数 ) from dual; 求幂函数 ,3) from dual; 求余弦三角函数 select cos(3.14159) from dual; 求 ...

  3. Back Track 5 之 网络踩点

    DNS记录探测 dnsenum 针对NDS信息收集的工具 格式: ./dnsenum.pl dbsserver (域名) 请原谅我拿freestu.net这个学校团委的域名做的测试,求不黑!! dns ...

  4. div css水平垂直居中

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. B - Sort the Array

    找出一个递减序列,假设有两个或两个以上递减序列直接no了,然后对递减序列两端数start.end,然后比較a[start]和a[end+1] . a[end] 和a[start-1] #include ...

  6. Android控件之HorizontalScrollView 去掉滚动栏

    在默认情况下.HorizontalScrollView控件里面的内容在滚动的情况下,会出现滚动栏,为了去掉滚动栏.仅仅须要在<HorizontalScrollView/>里面加一句    ...

  7. ArcEngine中的缩放地图

    在ArcEngine地图操作中,缩放地图的功能经常用到,这里做一个小结. 缩放地图一般可分为以下几种情况: 1.缩放地图:与放大地图相对,一般是手动绘制区域或固定比例缩放,可调用命令或Expand函数 ...

  8. STL - 容器 - Array

    Array是C++ 11给STL新增加的容器 ArrayTest.cpp #include <array> #include <algorithm> #include < ...

  9. hibernate:MySQL No Dialect mapping for JDBC type: -1

    出处:(hibernate中使用原生的sql语句,报如下错误:) MySQL No Dialect mapping for JDBC type: -1 代码: List list = session. ...

  10. Java从零开始学十八(抽象类和接口)

    一.什么是抽象类和接口 抽象类.接口与类是一个层次的概念,是java中极其重要的概念. 抽象类是从多个类中抽象出来的公共模板,提供子类均具有的功能. 接口是从多个类中抽象出来的规范,体现的是规范和实现 ...