0 0

C# 连接Oracle 连接池 请有经验朋友指点20

这个是我参考JAVA连接池写的,也手动测试了,感觉没什么效果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Oracle.DataAccess.Client;
using System.Threading;
using System.Data;

namespace DBHelp
{
    public class ConnectionPool
    {
        /// <summary>
        /// 最少连接数
        /// </summary>
        private static int minConn;
        /// <summary>
        /// 最大连接数
        /// </summary>
        private static int maxConn;
        /// <summary>
        /// 现有连接数
        /// </summary>
        private static int connAmount;
        /// <summary>
        /// 使用Stack保存数据库连接
        /// </summary>
        private static Stack connStack;
        /// <summary>
        /// 连接池类对象
        /// </summary>
        private static ConnectionPool connectionPoll;
        /// <summary>
        /// 繁忙时等待时间
        /// </summary>
        private static int waitTime;
        /// <summary>
        /// 连接字符串
        /// </summary>
        private static string connstr = null;

        string serverPath = System.Reflection.Assembly.GetExecutingAssembly().Location.Substring(0, System.Reflection.Assembly.GetExecutingAssembly().Location.LastIndexOf("\\"));
        /// <summary>
        /// 程序运行时,创建一个静态只读的进程辅助对象
        /// </summary>
        private static readonly object _object = new object();

        /// <summary>
        /// 返回一个实例,如果是第一次调用此方法则创建一个新实例
        /// </summary>
        /// <returns></returns>
        public static ConnectionPool getInstance()
        {

            if (connectionPoll == null)
            {
                lock (_object)
                {
                    connectionPoll = new ConnectionPool();
                }
            }
            return connectionPoll;
        }

        /// <summary>
        /// 读取属性文件获得数据库连接信息及连接池信息
        /// </summary>
        public string getConn()
        {

            if (connstr == null)
            {
                try
                {
                    ArrayList host = getConfig.PrintAttributes(serverPath + "\\config.xml", "datehost");
                    ArrayList port = getConfig.PrintAttributes(serverPath + "\\config.xml", "dateport");
                    ArrayList user = getConfig.PrintAttributes(serverPath + "\\config.xml", "dateuser");
                    ArrayList password = getConfig.PrintAttributes(serverPath + "\\config.xml", "datepassword");
                    ArrayList databasename = getConfig.PrintAttributes(serverPath + "\\config.xml", "databasename");
                    ArrayList CminConn = getConfig.PrintAttributes(serverPath + "\\config.xml", "minConn");
                    ArrayList CmaxConn = getConfig.PrintAttributes(serverPath + "\\config.xml", "maxConn");
                    ArrayList CwaitTime = getConfig.PrintAttributes(serverPath + "\\config.xml", "waitTime");
                    minConn = Convert.ToInt32(CminConn[0].ToString());
                    maxConn = Convert.ToInt32(CmaxConn[0].ToString());
                    waitTime = Convert.ToInt32(CwaitTime[0].ToString());

                    connstr = "Data Source=(DESCRIPTION="
                     + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + host[0].ToString() + ")(PORT=" + port[0].ToString() + ")))"
                     + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" + databasename[0].ToString() + ")));"
                     + "User Id=" + user[0].ToString() + ";Password=" + password[0].ToString() + ";";
                }
                catch (Exception ex)
                {
                    throw ex;
                }

            } return connstr;

        }

        /// <summary>
        /// 连接池
        /// </summary>
        public ConnectionPool()
        {
            getConn();
            connStack = new Stack();

            for (int i = 0; i < minConn; i++)
            {
                connStack.Push(newConnection());
            }
        }


        /// <summary>
        /// 从连接池中得到连接
        /// </summary>
        /// <returns></returns>
        public static OracleConnection getConnection()
        {
            OracleConnection conn = null;
            if (connStack.Count > 0)
            {
                conn = (OracleConnection)connStack.Pop();
            }
            else if (connAmount < maxConn)
            {
                conn = newConnection();
            }
            else
            {
                try
                {
                    Thread.Sleep(waitTime);//等待一会
                    Console.WriteLine("等待……");
                    return getConnection();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return conn;
        }


        /// <summary>
        /// 归还连接
        /// </summary>
        /// <param name="conn"></param>
        public static void freeConnection(OracleConnection conn)
        {
            connStack.Push(conn);
        }


        /// <summary>
        /// 创建新连接
        /// </summary>
        /// <returns></returns>
        public static OracleConnection newConnection()
        {
            OracleConnection conn = null;
            try
            {
                conn = new OracleConnection(connstr);
                connAmount++;
                Console.WriteLine("连接池创建一个连接" + conn.ToString() + "现在连接池中的连接数是:" + connAmount);
                if (conn != null && conn.State != ConnectionState.Open)
                {
                    conn.Open();//打开连接
                }
                return conn;
            }
            catch (Exception e)
            {
                e.Message.ToString();
            }
            return conn;
        }

    }
}




各位朋友,发飙吧!

沉了。。。。。
2010年6月24日 16:16

1个答案 按时间排序 按投票排序

0 0

除了connAmount 会保持在最大值以外,也没什么大问题
怎么测试的啊

2010年7月08日 09:19

相关推荐

    C#连接Oracle数据库字符串

    C#连接Oracle数据库字符串 C#连接Oracle数据库字符串

    C#连接Oracle数据库(查询数据)

    C#连接Oracle数据库(查询数据)方法,好东西,分享一下

    C#连接Oracle数据库

    总结,C#连接Oracle数据库涉及的主要知识点包括:安装Oracle数据提供程序,使用`OracleConnection`建立连接,通过`OracleCommand`执行SQL,使用`OracleTransaction`管理事务,以及参数化查询和异常处理等。...

    基于C#连接Oracle数据库Oracle.ManagedDataAccess

    本篇将详细讲解如何使用C#通过Oracle.ManagedDataAccess库实现与Oracle数据库的连接,无需在本地安装完整的Oracle数据库。 首先,Oracle.ManagedDataAccess是Oracle公司提供的一个纯.NET框架的客户端驱动,它允许...

    C#连接Oracle11g无需安装客户端

    标题 "C#连接Oracle11g无需安装客户端" 指出了一种技术方案,它允许C#开发者在不安装Oracle客户端的情况下,也能与Oracle 11g数据库进行交互。这种做法大大简化了开发环境的配置,提高了开发效率,尤其对于那些在多...

    C#连接oracle数据库的源代码.doc

    C#连接oracle数据库的源代码

    c#连接oracledemo

    在这个"**c#连接oracledemo**"项目中,我们将探讨如何使用C#连接到Oracle 11g数据库,以及一些相关的知识点。 首先,要进行C#连接Oracle,你需要在开发环境中安装Oracle的客户端组件。Oracle提供了一个名为ODP.NET...

    C#中oracle连接数据库的封装类

    在C#编程环境中,Oracle数据库的连接和操作通常需要通过ADO.NET或者其他第三方库来实现。在本场景中,我们关注的是一个名为"C#中oracle连接数据库的封装类"的主题,这个主题涉及到创建一个名为`DbHelperOra.cs`的类...

    C#连接oracle数据库实例

    当需要与Oracle数据库进行交互时,可以借助Oracle提供的Oracle Managed Data Access (ODP.NET Managed Driver)库,该库使得C#程序员能够轻松地连接到Oracle数据库并执行查询、更新等操作。本实例将详细介绍如何使用...

    c# 连接oracle数据库和对数据库的基本操作

    本篇文章将深入探讨如何使用C#连接Oracle数据库以及执行基本的数据操作。由于描述中提到这适用于初学者,我们将从基础知识开始讲解,并且不涉及高级或优化的技巧。 首先,你需要安装Oracle的数据提供者,即Oracle ...

    c# mysql数据库连接池实现

    本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕...

    C#连接Oracle数据增删改查

    本文将深入探讨如何使用C#连接Oracle数据库并进行基本的增删改查操作。通过提供的OracleTest增删改查项目源码,我们可以直观地了解这一过程。 首先,连接Oracle数据库需要Oracle的客户端驱动,例如ODP.NET(Oracle ...

    C#高效数据库连接池源码

    自定义数据库连接池还可以考虑支持多种数据库类型,例如SQL Server、MySQL、Oracle等,通过泛型或接口实现对不同数据库的适配。 理解并掌握C#高效数据库连接池的实现,对于开发高性能的数据库应用至关重要。通过...

    C#连接Oracle10g,11g,12g所需的DLL(无需安装Oracle客户端,64位,32位通用版)

    本篇文章将深入探讨如何使用C#连接Oracle10g、11g及12g数据库,特别是如何利用提供的"Oracle.ManagedDataAccess.dll"库,这是一个64位和32位通用的版本。 Oracle.ManagedDataAccess.dll是Oracle公司为.NET ...

    C#中连接oracle连接方法

    在C#中与Oracle数据库...总的来说,C#连接Oracle数据库涉及到安装必要的驱动,构建正确的连接字符串,以及使用ADO.NET组件进行数据操作。理解这些基本概念和方法,将帮助你在实际项目中顺利地与Oracle数据库进行通信。

    C# 数据库连接池 C# 数据库连接池

    数据库连接池是数据库管理中的一个重要概念,它在C#编程中扮演着优化数据库操作的关键角色。C#数据库连接池是一种管理数据库连接的技术,通过复用已存在的连接而不是每次请求时都创建新的连接,从而提高数据库操作的...

    C# 连接 Oracle 的六种方式

    ### C#连接Oracle数据库的六种方式 在开发过程中,我们常常需要将C#应用程序与Oracle数据库进行连接,以便执行数据读写等操作。本文将详细介绍C#连接Oracle的六种常见方法,并对每种方法的特点及适用场景进行分析。...

    C#成功连接Oracle数据库工程

    本项目“C#成功连接Oracle数据库工程”旨在详细介绍如何利用C#进行Oracle数据库的连接和操作。 首先,要实现C#与Oracle的连接,你需要安装Oracle的数据提供程序,也称为ODP.NET(Oracle Data Provider for .NET)。...

    C#连接oracle数据库执行简单的增删改查操作.docx

    C#连接Oracle数据库执行简单的增删改查操作 C#连接Oracle数据库执行简单的增删改查操作是指使用C#语言连接Oracle数据库,并执行基本的数据操作,如增删改查。下面是对该操作的详细解释: 一、连接Oracle数据库 要...

    c#连接Oracle的快速方法,使用Oracle.ManagedDataAccess的综合教程,全开源

    C#连接Oracle的快速方法,使用Oracle.ManagedDataAccess的综合教程,全开源 1)直接输入Oracle数据库IP\用户名、密码等信息,就可以连接数据库 2)已经写好了一个操作类OracleHelper,可以非常方便的操作数据库返回...

Global site tag (gtag.js) - Google Analytics