月亮弯弯

不努力,你离要饭只有3天
随笔 - 0, 文章 - 2, 评论 - 0, 引用 - 0
数据加载中……

搭建基于 Java 的 WEB 应用程序(二)

Tomcat 的数据库连接池

   配置好 Log4j 之后,就可以很方面的跟踪这个项目,Debug 起来也很方便。接下来就要慢慢搭建 WEB 的底层了。

   之前传统的数据库连接池一般都是在 Tomcat 的 Admin 页面直接操作的。又或者自己利用 JDBC 手动配置。

   Apache 最近推出了一个开源项目,基于 DBCP 的数据库连接池。具体内容可以参考这里:http://jakarta.apache.org/commons/dbcp/index.html

   要使用 DBCP 数据库连接池,必需要先下载以下 3 个 Jar 包:

   commons.dbcp
   commons.collections
   commons.pool

   把这3个包解压后加入到你的工程中就可以了。

   下面是 使用 DBCP 建立数据库连接池的示例代码(数据库用的是 MySQL):


import  java.sql. * ;

import  org.apache.commons.dbcp. * ;
import  org.apache.commons.pool. * ;
import  org.apache.commons.pool.impl. * ;

public   class  DBLinkPool  {

    
private   static  org.apache.log4j.Category log  =  org.apache.log4j.Category.
            getInstance(DBLinkPool.
class );
    
/**
     * 数据库连接池
     * 
@see   http://jakarta.apache.org/commons/dbcp/index.html
     
*/

    
private   static  PoolingDriver driver  =   null ;


    
/**
     * 设置一个数据库连接池
     *
     * 
@param  name 连接池的名称
     * 
@param  url 数据源
     * 
@throws  SQLException
     
*/

    
private   static   void  setUpDriverPool(String name, String url)  throws
            SQLException 
{
        
if  ((driver  ==   null ||  driver.getPoolNames().length  <   2 {
            
try   {
                
/**
                 * 首先创建一个对象池来保存数据库连接
                 *
                 * 使用 commons.pool 的 GenericObjectPool对象
                 
*/

                ObjectPool connectionPool 
=   new  GenericObjectPool();

                
/**
                 * 创建一个 DriverManagerConnectionFactory对象
                 * 连接池将用它来获取一个连接
                 
*/

                ConnectionFactory connectionFactory 
=   new
                        DriverManagerConnectionFactory(url, 
null );

                
/**
                 * 创建一个PoolableConnectionFactory 对象。
                 
*/

                PoolableConnectionFactory poolableConnectionFactory 
=
                        
new  PoolableConnectionFactory(connectionFactory,
                        connectionPool, 
null null false true );

                
/**
                 * 注册PoolingDriver。
                 
*/

                Class.forName(
" org.apache.commons.dbcp.PoolingDriver " );

                driver 
=  (PoolingDriver) DriverManager.getDriver(
                        
" jdbc:apache:commons:dbcp: " );

                driver.registerPool(name, connectionPool);

            }
  catch  (ClassNotFoundException e)  {
                log.error(e.getMessage(),(Throwable)e);
            }

        }

    }


    
/**
     * 关闭所有数据库连接池
     *
     
*/

//     public static void shutDownDriver() {
//
//         try {
//             PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//             for (int i = 0; i < poolNames.length; i++) {
//                 driver.closePool("pool");
//             }
//         }
//         catch (SQLException sqle) {
//             throw new RuntimeException(sqle);
//         }
//     }

    
/**
     * 取得一个数据库连接对象。
     *
     * 因为可能使用两个不同的数据库,
     * 所以依据report的值来确定使用那个数据库。
     *
     * 
@param  report
     * 
@return
     
*/

    
public   static  Connection getConnection()  {
        Connection con 
=   null ;

        
try   {
            
// 装载mysql的jdbc驱动
            String driver  =   " com.mysql.jdbc.Driver " ;
            String url 
=
                    
" jdbc:mysql://localhost/oamisinfo?user=root&password=kingsoft&useUnicode=true&characterEncoding=UTF-8 " ;
            String poolName 
=   " pool " ;
            log.info(
" URL is :  "   +  url);
            Class.forName(driver);
            setUpDriverPool(poolName, url);
            con 
=  DriverManager.getConnection( " jdbc:apache:commons:dbcp: "   +
                                              poolName);
            log.info(
" Connected Succeed! " );
            
return  con;
        }
  catch  (ClassNotFoundException cnfe)  {
            log.error(cnfe.getMessage(),(Throwable)cnfe);
            
throw   new  RuntimeException( " 无法装入数据库引擎 " );
        }
  catch  (SQLException sqle)  {
            log.error(sqle.getMessage(),(Throwable)sqle);
            
throw   new  RuntimeException( " 无法打开数据库连接 " );
        }

    }


    
/**
     * 执行清理过程
     *
     * <li>关闭数据库连接</li>
     * <li>关闭语句对象</li>
     * <li>关闭结果集</li>
     *
     * 
@param  con
     * 
@param  s
     * 
@param  rs
     
*/

    
public   static   void  closeAll(Connection con, Statement s, ResultSet rs)  {
        
try   {
            
if  (rs  !=   null {
                rs.close();
                rs 
=   null ;
            }


            
if  (s  !=   null {
                s.close();
                s 
=   null ;
            }


            
if  (con  !=   null {
                con.close();
                con 
=   null ;
            }

        }
  catch  (SQLException sqle)  {
            
// nothing to do, forget it;
        }

    }


    
public   static   void  main(String[] args)  {
        Connection conn 
=  DBLinkPool.getConnection();
        ResultSet rs 
=   null ;
        String sql 
=   " select * from t_questionsort " ;
        
try   {
            PreparedStatement ps 
=  conn.prepareStatement(sql);
            rs 
=  ps.executeQuery();
            
while  (rs.next())  {
                System.out.println(rs.getString(
" SortName " ));
            }


        }
  catch  (SQLException ex)  {
            ex.printStackTrace();
        }

    }

}


   下面写个类来测试它:


// Import your DBLinkPool class
import  com.kingsoft.sys.DBLinkPool;
import  java.sql. * ;
public   class  TestDB  {
    
private   static  org.apache.log4j.Category log  =  org.apache.log4j.Category.
            getInstance(TestDB.
class );
            
public  TestDB()  {
    }

    
public   static   void  main(String[] args)  {
        
try   {
            Connection conn 
=  DBLinkPool.getConnection();
            log.info(
" Connect was Succeed " );
            System.out.println(
" Connect was Succeed " );
        }
  catch  (Exception ex)  {
            log.error(ex.getMessage(),(Throwable)ex);
        }
        
    }

}


如果看到 Connect was Succeed,就证明数据库连接池的配置成功了。里面对 连接数的控制,连接集合的控制,完全不用你来操心了。你只需要做的就是从这个连接池类中拿过来一个 Connection 就可以了。

   下一节说说在 WEB 应用中经常用的操作 DB 的一些底层方法。包括数据库的 增、删、改、查和分页功能。

   都是一些计较简单的,但对于中小型项目又是最有效率的。

posted on 2006-07-17 11:35 小悦 阅读(73) 评论(0)  编辑 收藏 引用 所属分类: Java 技术频道

只有注册用户登录后才能发表评论。