数据源与JNDI资源实现JSP数据库连接池实例
名词解释: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数据库连接池实例的更多相关文章
- Python数据库连接池实例——PooledDB
不用连接池的MySQL连接方法 import MySQLdbconn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='my ...
- Python数据库连接池实例——PooledDB
不用连接池的MySQL连接方法 import MySQLdb conn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='m ...
- 简单的数据库连接池实例(java语言)
1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList synchro ...
- JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术
本文目录: 1.应用程序直接获取连接的缺点(图解) 2.使用数据库连接池优化程序性能(图解) 3.可扩展增强某个类方法的功能的三种方式 4.自定 ...
- glassfish中新建数据源(创建数据库连接池)
1.浏览器输入:http://localhost:4848 登录glassfish域管理控制台,默认的用户名和密码是amin和adminadmin.(也可以通过NetBeans的服务选项卡--服务器- ...
- java web学习总结(十六) -------------------数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- JavaWeb学习总结(十三)--数据库连接池
一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...
- javaweb学习总结(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- JavaWeb学习(三十)———— 数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
随机推荐
- Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)
本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783 简单的东西我都说的几乎相同了,想挖点深的差点把自己给填进去. ...
- ActiveMQ使用示例之Queue
我们使用ActiveMQ为大家实现一种点对点的消息模型. 开发时候,要将apache-activemq-5.12.0-bin.zip解压缩后里面的activemq-all-5.12.0.jar包加入到 ...
- Python3 写Windows Service服务程序
用Python开发Windows Service,用Python来做这个事情必须要借助第三方模块pywin32,下载路径:https://pypi.org/project/pywin32/#files ...
- EF实体类的枚举属性映射设计方法
public class FoundationInfo { [Column("id")] public int ID { get; set; } public InvestType ...
- C# 使用DateTime.TryParseExact将自定义日期类型转换成日期
在C#中如果将一个字符串类型的日期转换成日期类型很方便的 即使用Convert.ToDateTime("2015/01/01").ToString()或DateTime.TryPa ...
- C#.NET常见问题(FAQ)-list比数组效率低多少
对于List,即长度不确定的数组而言,十万笔数据*12倍,就是120万笔数据,只需要93ms左右 换成了二维数组,效果也是差不多,78ms,可见list的效率只比double差一点点 更多 ...
- SpringMVC上传文件的三种方式(转载)
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- STL - Map - 运行期自定义排序
RuntimeStringCmp.cpp #include <string> using namespace std; // function object to compare stri ...
- Appium Python 三:Desired capabilities
简介 Desired capabilities 是一些键值对的集合.python里面就采用字典的方式. 客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试.比如,我们可以把 platformNa ...
- LoadRunner 测试 Mysql
准备文件 1. 下载 MySQL LoadRunner libraries. 下载地址:http://files.cnblogs.com/files/xiaoxitest/MySQL_LoadRunn ...