构建一个高可扩展性javabean和jsp连接数据库操作

1. 我们先在Tomcat 中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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类就产生了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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页面进行查询

1
2
3
4
5
Iterator it=UserQuery.getResult();
while(it.hasNext())
{
  out.print((String)it.next());
}<br><br>//尚不完善的地方:虽然情况好了一些,但当使用ArrayList取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。

构建一个高可扩展性javabean和jsp连接数据库操作,布布扣,bubuko.com

构建一个高可扩展性javabean和jsp连接数据库操作

上一篇:RHCE 系列(七):在 Linux 客户端配置基于 Kerberos 身份验证的 NFS 服务器


下一篇:异常详细信息: System.Web.Hosting.HostingEnvironmentException: 访问 IIS 元数据库失败 解决方法