构建一个高可扩展性javabean和jsp连接数据库操作
1. 我们先在Tomcat 中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放。
package Panabia.db; import javax.sql.DataSource;
import javax.naming.*;
import java.sql.*; public class SQLFactory
{
private static DataSource ds = null;
private static Object Lock = new Object(); // 生成DataSource**
public static DataSource gainDataSource()
{
try{
if(ds==null)
{
synchronized(Lock)
{
if(ds==null)
{
Context ctx=new InitialContext();
ds=(DataSource)ctx.lookup(\"java:comp/env/jdbc/Panabia\");
}
}
}
}catch(NamingException e){
e.printStackTrace();
}
return ds;
} // 生成SQL连接**
public static synchronized Connection gainConnection()
{
Connection con = null;
try{
if(ds == null)
{
gainDataSource();
}
con = ds.getConnection();
}catch (SQLException e){
e.printStackTrace();
}
return con;
} // 释放SQL连接**
public static void releaseConnection(ResultSet rs, PreparedStatement ps,
Statement sql, Connection con)
{
try
{
if (rs != null)
rs.close();
}catch (SQLException e) {
e.printStackTrace();
} try
{
if (ps != null)
ps.close();
}catch (SQLException e) {
e.printStackTrace();
} try
{
if (sql != null)
sql.close();
}catch(SQLException e) {
e.printStackTrace();
} try {
if (con != null && !con.isClosed())
con.close();
}catch (SQLException e) {
e.printStackTrace();
}
} }
大家都应该注意到了,这个类的所有的方法全部是static的,之所以这样,主要是为了方便其它“扩展类”的调用,当然,还有其它好处--- :)
2. 然后,这个类就封装完毕了,现在我们就可以针对不同的应用要求单独写javaBean了,比如一个简单的:在JSP中列出verify表中的所有用户名与密码列表。
该怎么做?--使用SQLFactory生成Connection,再生成Statement,再生成ResultSet--然后枚举吗?好象不错,哦,等等......这样做你难道没有一种“非常亲切”的感觉吗?---对了,ASP,PHP中就是如此-Faint~我们怎么又回到“原始社会”了....
有没有更好的方式?答案是肯定的,JAVA的能力是“通天”的强大,只要你能想得到,仔细看看它的API Document,就不难找出解决办法。
答案出来了:
我们在查询类中返回Iterator到JSP枚举,而不是ResultSet。
好了,我们的UserQuery类就产生了:
package Panabia.operate; import Panabia.db.SQLFactory;
import java.util.*;
import java.sql.*; public class UserQuery
{
private ArrayList list = null;
private Connection con = null;
private Statement sql = null;
private ResultSet rs = null; public Iterator getResult()
{
try{
con=SQLFactory.gainConnection();
sql=con.createStatement();
rs=sql.executeQuery(\"select * from verify\");
//verify表只有两个字段:username,password;
list=new ArrayList();
while(rs.next())
{
list.add(rs.getString(1));
list.add(rs.getString(2));
}
}catch(SQLException e){
e.printStackTrace();
}finally{
SQLFactory.releaseConnection(rs,null,sql,con);
} return list.iterator();
}
}
3. 在jsp页面进行查询
Iterator it=UserQuery.getResult();
while(it.hasNext())
{
out.print((String)it.next());
} //尚不完善的地方:虽然情况好了一些,但当使用ArrayList取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。
构建一个高可扩展性javabean和jsp连接数据库操作的更多相关文章
- 通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构
原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active ...
- javabean+servlet+jsp程序_个人辛苦探索
主要介绍主流的java web编程技术.设计模式和框架,以及如何利用Eclipese开发Web应用程序. 要点:1.Java Web编程的主要组件技术: 2.MVC设计模式: 3.用Eclipse构建 ...
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- 基于TMF SID的高可扩展性数据模型
基于TMF SID的高可扩展性数据模型 前言 此文根据TMF SID规范撰写,欢迎大家提出建议和意见. TMF文档版权信息 Copyright © TeleManagement Forum 2013. ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- 从零构建一个简单的 Python Web框架
为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...
- javaBean和jsp应用
原网页:http://www.douban.com/note/102320977/ JavaBean是一种可复用,跨平台的组件.共有两种JavaBean:一种无用户界面,这种一般用于处理数据运算,操作 ...
- JavaBean与Jsp
这一节我们总结一下JavaBean和Jsp的关系. 1. JavaBean javaBean是一个遵循特定写法的Java类,它通常具有如下特点: 1)这个java类必须具有一个无参构造函 ...
随机推荐
- Pg188-3 构造方法
package org.hanqi.array; public class Father { private String name; private int age; public String g ...
- MySQL5.6 Waiting for Commit Lock
mysql Bug#19843808 自动修复记录 MySQL5.6和Xtrabackup之间存在一个bug,这个bug在5.6.23中已经修复. Xtrabackup备份的时候执行flushs t ...
- day5模块学习--XML模块
XML文件处理 XML文件处理,有好几种方式,这里介绍一下xml.etree.ElementTree as ET. 注意:xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全 ...
- 最小圆覆盖 gym-102006 I
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- C++运算符重载 模板友元 new delete ++ = +=
今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写 ...
- Rob Pike:我得到的最佳编程建议
Rob Pike:我得到的最佳编程建议 Rob Pike,目前谷歌公司最著名的软件工程师之一,曾是贝尔实验室Unix开发团队成员,Plan9操作系统开发的主要领导人,Inferno操作系统开发的主要领 ...
- iOS 9应用开发教程之多行读写文本ios9文本视图
iOS 9应用开发教程之多行读写文本ios9文本视图 多行读写文本——ios9文本视图 文本视图也是输入控件,与文本框不同的是,文本视图可以让用户输入多行,如图2.23所示.在此图中字符串“说点什么吧 ...
- hdu 2732 最大流 **
题意:题目是说一个n*m的迷宫中,有每个格子有柱子.柱子高度为0~3,高度为0的柱子是不能站的(高度为0就是没有柱子)在一些有柱子的格子上有一些蜥蜴,一次最多跳距离d,相邻格子的距离是1,只要跳出迷宫 ...
- Remove-Invalid-Parentheses-题解
题意 Remove the minimum number of invalid parentheses in order to make the input string valid. Return ...
- [LeetCode] Max Points on a Line 题解
题意 Given n points on a 2D plane, find the maximum number of points that lie on the same straight lin ...