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

将torque的数据库连接池由DBCP替换为C3P0

    博客分类:
  • java
阅读更多
先说说项目情况吧,公司承建了中国电信14个省公司的号码百事通114查号平台,平台中有一个socket服务程序负责接收座席客户端的查号消息,解析消息,获得查号关键条件,组织sql查询数据库,查询相关信息,并同时记录座席操作日志(座席人员工资结算以日志为准),操作完成后组织消息返回给座席客户端。
socket服务程序是由我搭建的一个socekt框架的一部分功能负责,该框架支持阻塞式的socket通讯,支持长连接和短连接两种方式,多线程并发处理消息收发,数据库操作使用apache开源项目torque,在各省平台中使用时,在一些业务量大的省公司平台上,出现了DBCP数据库连接池无法及时回收连接的情况,造成socket服务程序无法提供服务,为了解决该问题,修改torque源码,实现对C3P0数据库连接池的支持,代码升级后,均未再现上述问题。
torque支持C3P0:
1、下载C3P0:c3p0-0.9.1.2.jar、c3p0-oracle-thin-extras-0.9.1.2.jar
2、继承AbstractDataSourceFactory实现基于C3P0数据库连接池的工厂类,编译后打包新的jar包
3、修改torque.properties,将连接池配置改为C3P0方式
4、将涉及包和配置文件放入工程

C3P0DataSourceFactory.java源码:
package org.apache.torque.dsfactory;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import javax.sql.ConnectionPoolDataSource;
import javax.sql.DataSource;

import org.apache.commons.configuration.Configuration;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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

import org.apache.torque.Torque;
import org.apache.torque.TorqueException;

/**
 * A factory that looks up the DataSource using the JDBC2 pool methods.
 *
 * @author <a href="mailto:jmcnally@apache.org">John McNally</a>
 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
 * @version $Id: C3P0DataSourceFactory.java 476550 2006-11-18 16:08:37Z tfischer $
 */
public class C3P0DataSourceFactory
    extends AbstractDataSourceFactory
{

    /** The log. */
    private static Log log
            = LogFactory.getLog(C3P0DataSourceFactory.class);

    /** The wrapped <code>DataSource</code>. */
    private ComboPooledDataSource ds = null;

    /**
     * @see org.apache.torque.dsfactory.DataSourceFactory#getDataSource
     */
    public DataSource getDataSource()
    {
        return ds;
    }

    /**
     * @see org.apache.torque.dsfactory.DataSourceFactory#initialize
     */
    public void initialize(Configuration configuration) throws TorqueException
    {
    	log.debug("Starting initialize ----------- ");
        super.initialize(configuration);
       
        ComboPooledDataSource dataSource = initJdbc2Pool(configuration);
        
        this.ds = dataSource;
    }

    /**
     * Initializes the Jdbc2PoolDataSource.
     *
     * @param configuration where to read the settings from
     * @throws TorqueException if a property set fails
     * @return a configured <code>Jdbc2PoolDataSource</code>
     */
    private ComboPooledDataSource initJdbc2Pool(Configuration configuration)
        throws TorqueException
    {
        log.debug("Starting initJdbc2Pool");
		Configuration c = Torque.getConfiguration();
        ComboPooledDataSource dataSource = new ComboPooledDataSource();        

        if (c == null || c.isEmpty())
        {
            log.warn("Global Configuration not set,"
                    + " no Default pool data source configured!");
        }
        else
        {
            Configuration conf = c.subset(DEFAULT_POOL_KEY);
           	
            applyConfiguration(conf, dataSource);
        }
        //init 数据库连接
        Configuration connConf = configuration.subset(CONNECTION_KEY);
        applyConfiguration(connConf, dataSource);
        //init 数据库连接池
        Configuration conf = configuration.subset(POOL_KEY);
        applyConfiguration(conf, dataSource);

        return dataSource;
    }


    /**
     * Closes the pool associated with this factory and releases it.
     * @throws TorqueException if the pool cannot be closed properly
     */
    public void close() throws TorqueException
    {
        try
        {
            ds.close();
        }
        catch (Exception e)
        {
            log.error("Exception caught during close()", e);
            throw new TorqueException(e);
        }
        ds = null;
    }
}


torque.properties 配置文件:
引用

# -------------------------------------------------------------------
# $Id: Torque.properties,v 1.11.2.2 2004/08/24 04:14:32 seade Exp $
#
# This is the configuration file for Torque.
#
# Note that strings containing "," (comma) characters must backslash
# escape the comma (i.e. '\,')
#
# -------------------------------------------------------------------

torque.applicationRoot = .

# -------------------------------------------------------------------
#
#  L O G G I N G
#
# -------------------------------------------------------------------
# We use Log4J for all Torque logging and we embed the log4j
# properties within our application configuration.
# -------------------------------------------------------------------

# This first category is required and the category
# must be named 'default'. This is used for all logging
# where an explicit category is not specified.

log4j.category.org.apache.torque = ALL, org.apache.torque
log4j.appender.org.apache.torque = org.apache.log4j.FileAppender
log4j.appender.org.apache.torque.layout = org.apache.log4j.PatternLayout
log4j.appender.org.apache.torque.layout.conversionPattern = %d [%t] %-5p %c - %m%n
log4j.appender.org.apache.torque.append = false

# -------------------------------------------------------------------
#
#  T O R Q U E  P R O P E R T I E S
#
# -------------------------------------------------------------------
# These are your database settings. Look in the
# org.apache.torque.pool.* packages for more information.
#
# The parameters to connect to the default database.  You MUST
# configure these properly.
# -------------------------------------------------------------------

torque.database.default=ups
torque.database.ups.adapter=oracle

# # Using commons-dbcp
#torque.dsfactory.yf.factory=org.apache.torque.dsfactory.SharedPoolDataSourceFactory
#torque.dsfactory.yf.pool.maxIdle=8
#torque.dsfactory.yf.pool.maxActive=10
#torque.dsfactory.yf.pool.testOnBorrow=true
#torque.dsfactory.yf.pool.validationQuery=select * from dual
#torque.dsfactory.yf.connection.driver = oracle.jdbc.driver.OracleDriver
#torque.dsfactory.yf.connection.url = jdbc:oracle:thin:@10.7.118.55:1521:shup
#torque.dsfactory.yf.connection.user = shup
#torque.dsfactory.yf.connection.password = shup

# # Using c3p0
torque.dsfactory.ups.factory=org.apache.torque.dsfactory.C3P0DataSourceFactory
#<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
torque.dsfactory.ups.pool.acquireIncrement=3
#<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
torque.dsfactory.ups.pool.acquireRetryAttempts=30
#<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
#torque.dsfactory.ups.pool.acquireRetryDelay=1000
#<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。
#单位毫秒。Default: 0 -->
torque.dsfactory.ups.pool.checkoutTimeout=30000
#<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
torque.dsfactory.ups.pool.initialPoolSize=3
#<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。
#单位:秒 Default: 0 -->
torque.dsfactory.ups.pool.maxIdleTime=0
#<!--连接池中保留的最大连接数。Default: 15 -->
torque.dsfactory.ups.pool.maxPoolSize=20
#<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
#属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
#如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
torque.dsfactory.ups.pool.maxStatements=150
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
torque.dsfactory.ups.pool.maxStatementsPerConnection=0
#<!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
#通过多线程实现多个操作同时被执行。Default: 3-->
torque.dsfactory.ups.pool.numHelperThreads=3
#<!--每60秒检查所有连接池中的空闲连接。单位:秒 Default: 0 -->
torque.dsfactory.ups.pool.idleConnectionTestPeriod=600
#<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
#测试的表必须在初始数据源的时候就存在。Default: null-->
torque.dsfactory.ups.pool.preferredTestQuery=select * from dual
#ups connnection
torque.dsfactory.ups.connection.driverClass = oracle.jdbc.driver.OracleDriver
torque.dsfactory.ups.connection.jdbcUrl = jdbc:oracle:thin:@10.7.118.55:1521:shup
torque.dsfactory.ups.connection.user = shup
torque.dsfactory.ups.connection.password = shup


# Determines if the quantity column of the IDBroker's id_table should
# be increased automatically if requests for ids reaches a high
# volume.

torque.idbroker.clever.quantity=false

# Determines whether the managers cache instances of the business objects.
# And also whether the MethodResultCache will really cache results.

torque.manager.useCache = true



0
0
分享到:
评论
1 楼 fuwang 2009-12-29  
请问你为何使用torque?

相关推荐

    Torque快速入门教程

    Torque是一个Apache的公开源代码项目,主要功能是实现对数据库的访问,方式是通过生成访问数据库的资源(包括创建数据库、表和初始化表的sql语句)和java代码、提供使用这些代码访问数据库的运行时(runtime)环境。...

    Torque的应用总结

    3. 当需要单独处理某一记录的某一字段时,需要先将BasePeer.doSelect(crit).get(0)强制转化成Record类型,再调用getValue(i)得到Value类型的变量,再将其转化成相应的数据类型。 二、BasePeer 和本类的 Peer 的使用...

    Torque-3.2.tar.gz

    Torque是由Apache孵化器项目孵化出的数据持久层框架,它以ORM(Object-Relational Mapping)为核心,旨在提供一种高效且灵活的方式来映射数据库关系到面向对象的模型。Torque不仅简化了SQL语句的编写,还通过自动化...

    torque 6.1.2

    "集群" 表明Torque是为多节点计算环境设计的,能够协调大量计算机共同处理工作负载。"linux" 指出这个软件主要在Linux操作系统上运行,因为Linux是集群计算的常用基础平台。 【详细说明】 Torque系统的核心功能...

    hpc作业调度 torque 6.1.2 (for Linux)

    Torque是其中一种广泛应用的作业调度系统,专为Linux集群设计,能够管理和协调大量计算任务的执行。 【Torque 6.1.2】 Torque 6.1.2是Torque作业调度器的一个特定版本,它提供了更稳定、高效和可扩展的特性。这个...

    作业提交系统Torque个人安装总结

    而Torque是由Clustering公司接手OpenPBS并持续维护的开源版本。 以下是对Torque安装和使用的详细说明: **一、Torque安装** 1. **下载并解压安装包**: 在master节点上,首先需要下载Torque的源代码包,例如...

    车况监控汉化版torque (1.5.50)

    2.由于OBD故障码数据库过于庞大,所以此版本未汉化故障码数据库 3.由于Torque这个车用软件专业强大,汉化不可能做到百分百用词准确;而且汉化组无车辆和蓝牙ELM327用于测试,所以难免出现汉化过度或遗漏的问题;希望...

    Torque游戏引擎指南

    《Torque游戏引擎指南》是一本专为游戏开发者和爱好者准备的详细教程,旨在帮助读者理解和掌握Torque游戏引擎的使用。Torque引擎是一款强大的3D游戏开发工具,以其易于学习、灵活的脚本系统和丰富的功能而备受赞誉。...

    torque 游戏引擎入门

    ### Torque游戏引擎入门知识点详解 #### 一、前言:计算机游戏产业的发展与游戏引擎的重要性 ...通过本教材的学习,读者将能够掌握使用Torque进行游戏开发的基本技能,为进一步深入学习和实践打下坚实的基础。

    torque入门教程

    总的来说,"torque入门教程"将带你走进Torque的奇妙世界,通过"trq_bot_pathfinding"这个实例,你将掌握基本的游戏开发技能,包括路径寻找、AI行为和网络编程。这只是一个开始,随着对Torque的深入理解,你将能够...

    TORQUE_Administrator's_Guide

    ### TORQUE 管理员指南知识点概览 #### 一、概述 - **TORQUE**:这是一种广泛使用的作业调度系统,主要用于管理集群中的计算任务。最初被称为 OpenPBS。 - **适用版本**:本指南针对的是 TORQUE 3.0.0 版本。 ####...

    Torque脚本帮助说明书

    本文将详细解析Torque 3D的规范、脚本编辑基本语法以及相关变量和命令,为初学者提供全面的指导。 1. **游戏框架结构** - **游戏服务器端**:游戏的核心逻辑通常在服务器端实现,包括玩家交互、游戏规则、数据管理...

    torque+maui 安装实例

    本文将详细介绍在 Linux 上安装配置 Torque+Maui 的全过程。 一、解压安装包 Torque+Maui 的安装需要首先解压安装包。使用以下命令解压安装包: tar zxvf torque-2.3.6.tar.gz 二、配置环境变量 在解压后的...

    torque admin guide

    本文将基于给定文件内容,针对Torque管理指南进行介绍。 1. Torque概述 Torque是一个开放源代码的集群管理工具,它负责资源调度、作业管理和资源监控。它允许系统管理员高效地管理一个或多个计算节点。Torque使用...

    Torque 基础学习

    在Torque中,角色通常由一个3D模型、一套动画和控制逻辑组成。玩家机制则涉及到角色的移动、交互和升级等。通过Torque Script,开发者可以定义角色的行为,如跳跃、攻击、拾取物品等。同时,Torque还提供了服务器端...

    torque+maui安装使用

    ### Torque与MAUI安装及使用详解 #### 一、Torque简介 Torque是一款功能强大的作业管理系统,广泛应用于高性能计算领域。...上述步骤涵盖了从Torque的安装到MAUI的集成,为构建一个高效稳定的集群提供了参考。

    Characterizing the Torque Lookup Table of an IPM Machine for Automotive

    With the output torque to be the main control target, various control algorithms are developed that aim to achieve high torque accuracy while maximizing the machine energy efficiency. Most of such ...

    torque4官方文档

    根据提供的信息,我们可以深入探讨Torque4的相关知识点,特别是其架构、配置以及作业提交与管理等方面。 ### Torque4概述 #### 架构概览 Torque4是一种高性能的作业调度系统,它由一个管理节点(称为服务器)和多...

    Torque游戏实战开发I

    Torque引擎由GarageGames公司开发,因其低价位和功能全面而受到游戏开发爱好者的青睐。本书的目的是为了弥补国内关于Torque引擎学习资料的不足,通过逐步讲解和实例操作,帮助读者构建基础的游戏框架,熟悉Torque...

Global site tag (gtag.js) - Google Analytics