`
kryptonum
  • 浏览: 98194 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

目前使用的JAVA数据库链接管理类

阅读更多
好吧,直入主题。
首先需要设置好数据库连接池,参见Javaworld@TW出的wiki
由于我们的服务器上仅有一个应用,使用的是在web.xml中添加一个随容器启动的servlet来实现加载连接池的方法,该servlet通过读取WEB-INF/config/proxool.xml完成proxool的初始化。如下:

<servlet-name>ServletConfigurator</servlet-name>
  
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
  
<init-param>
    
<param-name>xmlFile</param-name>
    
<param-value>WEB-INF/config/proxool.xml</param-value>
  
</init-param>
  
<load-on-startup>1</load-on-startup>
</servlet>

proxool.xml文件,注意   <alias>ems</alias>这项,将是DriverManager.getConnection()的参数
用户名和密码也需注意,下面的参数尚未经过严格测试,可能存在性能瓶颈,欢迎请
<?xml version="1.0" encoding="UTF-8"?>
<!-- the proxool configuration can be embedded within your own application's.
    Anything outside the "proxool" tag is ignored.
-->
<proxool-config>
    
<proxool>
        
<alias>ems</alias>
        
<driver-url>
            jdbc:jtds:sqlserver://localhost:1433/ems
        
</driver-url>
        
<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
        
<driver-properties>
            
<property name="user" value="user" />
            
<property name="password" value="user" />
        
</driver-properties>
        
<!--最少保持的空闲连接数-->
        
<prototype-count>5</prototype-count>
        
<!--允许最大连接数,超过了这个连接,再有请求时,就排在队列中-->
        
<maximum-connection-count>100</maximum-connection-count>
        
<!--最小连接数-->
        
<minimum-connection-count>10</minimum-connection-count>
        
<!--最大的等待请求数,即因没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
        
<proxool.simultaneous-build-throttle>
            200
        
</proxool.simultaneous-build-throttle>
        
<!--Test SQL-->
        
<house-keeping-test-sql>
            SELECT getDate()
        
</house-keeping-test-sql>
        
<!--自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
        
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
    
</proxool>

至此,准备工作已经完成,接下来就是DatabaseManagerjava
每个方法均有注释,需要commons.logging包,用于输出log
package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 数据库管理器:与数据库建立连接、断开连接、执行查询和更新操作
 * 
 * 
@author Kryptonum
 * 
@version 1.2
 * 
 
*/
public class DatabaseManager {

    
private static final Log logger = LogFactory.getLog(DatabaseManager.class);

    
public DatabaseManager() {
    }

    
/**
     * 获得一个数据库连接
     * 
     * 
@return Connection对象
     * 
     
*/
    
public Connection getConnection() {

        Connection conn 
= null;

        
try {
            Class.forName(
"org.logicalcobwebs.proxool.ProxoolDriver");
            conn 
= DriverManager.getConnection("proxool.ems");
        } 
catch (ClassNotFoundException e) {
            
// 在classpath中未找到合适的驱动
            logger.error("No suitable driver found");
            logger.error(e.getMessage());
            
return null;
        } 
catch (SQLException e) {
            
// 获取连接失败
            logger
                    .error(
"Get connection failed, check the proxool configuration file and web.xml");
            logger.error(e.getMessage());
            
return null;
        }

        
if (conn != null) {
            
if (logger.isDebugEnabled()) {
                logger.debug(
"Connected");
            }
        }

        
return conn;// 返回该Connection
    }

    
/**
     * 传入执行查询的语句,返回结果集
     * 
     * 
@param conn
     *            Connection连接对象
     * 
@param sql
     *            String类型的sql语句
     * 
@return 结果集 ResultSet
     
*/
    
public ResultSet executeQuery(Connection conn, String sql) {

        Statement stmt 
= null;// 声明Statement stmt
        ResultSet rs = null;// 声明ResultSet rs

        
if (conn != null) {
            
// Connection 不为null,执行查询

            
// 若debug模式开启,则输出debug 信息
            if (logger.isDebugEnabled()) {
                logger.debug(sql);
            }

            
try {
                stmt 
= conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);
// 通过Connection创建一个Statemet
                rs = stmt.executeQuery(sql);// 执行查询语句,
            } catch (SQLException sqlex) {
                logger.error(
"Execute query failed: [" + sql + "]");
                logger.error(sqlex.getMessage());
                
return null;
            }
            
return rs;
        } 
else {
            
// Connection 为null,输出info信息,返回null
            logger.info("Connection is null, execute sql query: [" + sql
                    
+ "] failed");
            
return null;
        }
    }

    
/**
     * 传入执行数据更新的语句,返回更新结果,成功执行为真
     * 
     * 
@param conn
     *            Connection连接对象
     * 
@param sql
     *            String类型的sql语句
     * 
@return 执行结果,布尔型
     
*/
    
public boolean executeUpdate(Connection conn, String sql) {

        
boolean status = false;// 执行结果,默认为false

        Statement stmt 
= null;// 声明Statement stmt

        
if (conn != null) {
            
// Connection 不为null,执行更新

            
// 若debug模式开启,则输出debug 信息
            if (logger.isDebugEnabled()) {
                logger.debug(sql);
            }

            
try {
                stmt 
= conn.createStatement();// 通过Connection创建一个Statemet
                int count = stmt.executeUpdate(sql);// 执行更新数据操作,返回影响的行数

                
// 根据count值,判断执行的成功或失败
                if (count > 0)
                    status 
= true;

            } 
catch (SQLException sqlex) {
                logger.error(
"Execute update failed: [" + sql + "]");
                logger.error(sqlex.getMessage());
            }
        } 
else {
            
// Connection 为null,输出info信息,返回false

            logger.info(
"Connection is null, execute sql update: [" + sql
                    
+ "] failed");
        }
        
return status;

    }

    
/**
     * 释放从连接池取得的连接
     * 
     * 
@param conn
     *            Connection连接对象
     
*/
    
public void releaseConnection(Connection conn) {

        
// 释放连接
        if (conn != null) {
            
try {
                conn.close();
                
if (logger.isDebugEnabled()) {
                    logger.debug(
"Connection released");
                }
            } 
catch (SQLException sqlex) {
                logger.error(
"Release connection failed");
            } 
finally {
                conn 
= null;
            }
        }
    }
}

代码的应用,举两个例子

1、查询
package ttm.bean;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.util.DatabaseManager;

public class ScoreTypeDAO {

    
private DatabaseManager dm = null;

    
private Connection conn = null;

    
/**
     * 构造函数,初始化DatabaseManager对象
     * 
     
*/
    
public ScoreTypeDAO() {
        dm 
= new DatabaseManager();
    }

    /**
     * 获取所有成绩类型编号
     * 
     * 
@return 所有成绩类型编号
     
*/
    
public ArrayList<String> getAllScoreTypeId() {

        ArrayList
<String> sctpId = new ArrayList<String>();
        String sql 
= "select SCORE_TP_ID from TC_SCORE_TP;";

        
try {
            
// 建立连接
            conn = dm.getConnection();
            ResultSet rst 
= dm.executeQuery(conn, sql);

            
while (rst.next()) {
                
// new a string
                String str = new String();

                str 
= rst.getString(1);// 成绩类型名称

                sctpId.add(str);
            }
        } 
catch (SQLException sqlex) {
            sqlex.printStackTrace();
        } 
finally {
            dm.releaseConnection(conn);
        }

        
return sctpId;
    }

}

2、删除
package ttm.bean;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.util.DatabaseManager;

public class CrswreDAO {

    
private DatabaseManager dm = null;

    
private Connection conn = null;

    
public CrswreDAO() {
        dm 
= new DatabaseManager();
    }

 

    
/**
     * 删除给定id的课件
     * 
     * 
@param crswreid
     
*/
    
public void delCrswre(String crswreid) {

        String sql 
= "delete from TC_EDU_CRSWRE where ISN = '" + crswreid + "'";

        
try {
            
// 建立连接
            conn = dm.getConnection();

            dm.executeUpdate(conn, sql);

        } 
finally {
            dm.releaseConnection(conn);
        }
    }

总结:简化的目的基本打到了,但是离我的目标还是有很大的差距。首先try...catch...finally还是存在,代码依然很繁杂;其次就是异常没有被很好的进行管理。
    这是第一次自己做工具的类尝试,虽然不是非常成功,却还是让我有很大的收获。独力完成如spring中的jdbc助手类般的代码对我而言似乎还太远,不过理解spring中的方法已经没有太大问题,接下来合理运用spring提供的基础架构是我和Pheonix要钻研的。


分享到:
评论
1 楼 lkjust08 2008-07-15  
    

相关推荐

    JAVA数据库连接池类

    本篇文章将深入解析一个自定义的JAVA数据库连接池类,帮助开发者更好地理解和运用这一关键技术。 首先,连接池的基本思想是预先创建一定数量的数据库连接,并存储在一个集合(如Vector)中,供应用程序按需获取和...

    java数据库连接详解

    Java作为一种广泛使用的编程语言,提供了强大的工具和API来处理与数据库的交互,其中最重要的一项技术就是Java数据库连接(JDBC)。本文将全面讲解JDBC的相关知识,包括其原理、基本概念以及如何使用JDBC进行数据库...

    java数据库操作通用类

    本文将深入探讨Java数据库操作通用类的核心概念、实现方式以及如何使用。 一、核心概念 1. 数据库连接池:为了提高数据库操作的效率,通常会使用数据库连接池来管理数据库连接。连接池预先创建了一定数量的数据库...

    Java 数据库连接泄漏 解决方法

    本文将详细介绍如何在WebLogic环境下解决Java数据库连接泄漏问题,包括临时解决方案和长期监控机制。 #### 二、什么是数据库连接泄漏? 数据库连接泄漏是指应用程序在使用完数据库连接后没有正确地关闭这些连接,...

    java数据库连接方法(一)

    这篇博客"java数据库连接方法(一)"将探讨如何在Java中建立与数据库的连接,包括JDBC(Java Database Connectivity)的基本概念、步骤以及常见的数据库连接池技术。下面是对这个主题的详细阐述。 **JDBC简介** ...

    java 数据库通用连接类

    Java数据库通用连接类是Java开发中非常重要的一个概念,它主要负责在Java应用程序与数据库之间建立连接,执行SQL语句并处理结果。在Java中,我们通常使用JDBC(Java Database Connectivity)API来实现这个功能。JDBC...

    java数据库连接测试

    Java数据库连接测试是一种常见的开发任务,它涉及到Java编程语言与各种数据库系统的交互。在这个场景中,我们看到几个关键的文件,这些文件暗示了这个小工具可能支持多种数据库,包括Oracle、MySQL、Microsoft SQL ...

    JAVA数据库工具类

    我们关注的是一个基于DBCP(Database Connection Pool)的数据库工具类,它利用了Google工程师Bob Lee提出的懒汉单例模式来构建连接工厂,并将数据库连接与当前线程绑定,以优化资源管理和防止过度使用连接。...

    JAVA数据库操作工具类

    2. **数据库连接管理**: 工具类通常会封装数据库连接的创建、管理和关闭过程,避免资源泄漏。这可能包括使用`Connection`对象的`connect()`和`close()`方法,以及在finally块中处理关闭连接的逻辑。 3. **SQL操作**...

    Java数据库操作类20170703

    本资料"Java数据库操作类20170703"聚焦于利用Java进行数据库交互,并且支持多种类型的数据库,包括Excel、Access、MSSQLServer、MySQL、Oracle以及通过JDBC-ODBC桥连接的其他数据库。它特别强调了使用数据库连接池来...

    通用java数据库连接程序

    本资源提供的"通用java数据库连接程序"是一个可复用的组件,能够方便地在各种项目中集成,以实现与数据库的无缝交互。下面将详细阐述这个程序的主要组成部分及其工作原理。 1. **RelationalInfoDao.java**: 这个...

    Java jdbc数据库连接池总结

    1. 并发问题:为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这可以通过使用 synchronized 关键字来确保线程的同步。 2. 多数据库服务器和多用户:对于大型的企业级应用,常常需要同时连接...

    java数据库驱动包

    Java数据库驱动包是Java应用程序与各种数据库之间进行通信的关键组件。在Java中,JDBC(Java Database Connectivity)是一个标准API...在实际开发中,了解并熟练掌握JDBC驱动的使用是每个Java数据库开发者的必备技能。

    java数据库操作类-连接池

    这些库提供了预配置的连接池管理类,但如果你需要自定义实现,`ConnectionPool`类可能包含初始化数据库连接、获取和释放连接以及关闭连接池的方法。例如,它可能会包含如下方法: ```java public class Connection...

    Java数据库通用操作类.doc

    从部分内容中可以看到,DBManager类是一个数据库操作管理类,提供了数据库连接、SQL语句执行、记录集处理等功能。该类使用Java语言实现,使用了多种Java标准库和Apache Log4j日志库。 知识点1:数据库连接 ...

    java与数据库连接图书管理系统.zip

    本项目提供了一个学习和实践Java数据库连接的好机会,通过这个过程,你可以加深对Java编程、SQL语言以及数据库管理的理解,同时提升解决实际问题的能力。在实践中不断探索和学习,你将能更好地掌握这些核心知识点,...

    java数据库应用程序编程指南

    2. **驱动管理器(DriverManager)**:在Java程序中,使用DriverManager类注册数据库驱动并建立到数据库的连接。例如,通过`Class.forName()`加载Oracle JDBC驱动,然后调用`DriverManager.getConnection()`创建连接...

    Java数据库编程案例2

    总之,Java数据库编程是一个关键技能,涵盖了数据库连接、SQL执行、结果集处理、事务管理和连接池等多个方面。通过学习和实践"Java数据库编程案例2"中的内容,开发者可以熟练地在Java应用程序中进行数据库操作,提升...

    java数据库连接池

    常见的Java数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等,它们提供了更完善的连接管理功能和性能优化策略。 总结一下,Java数据库连接池的基本概念和上述代码中的实现包括以下几点: 1. 数据库连接信息...

    神通数据库java连接驱动.zip

    首先,我们要了解Java数据库连接(JDBC)是Java平台的标准接口,它允许Java应用程序通过API来访问各种类型的数据库。JDBC驱动是这个接口的具体实现,用于在Java和数据库之间建立桥梁。神通数据库的Java驱动是实现这...

Global site tag (gtag.js) - Google Analytics