`

动态创建多个连接池

阅读更多
系统场景:系统依赖多个数据库。其中一台数据库服务器运行ORACLE,同时还有数台机器上跑着ObjectServer内存数据库。由于到部署时才能确定从机的数量,因此需要动态创建连接池

方案:Oracle数据库用c3p0来管理连接池。另外写一个连接管理器来动态创建内存数据库连接池

代码:经过简化,只贴出关键代码,去掉日志、异常处理、null检查等
// ObejctServer连接池,系统中域的数量与该类实例一一对应 
public class DBConnectionPool
{
    private int checkedOut;// 已检出的连接数

    private Vector<Connection> freeConnections = new Vector<Connection>();// 空闲连接数

    // 返还连接
    public synchronized void freeConnection(Connection con, Object lock)
    {
        freeConnections.addElement(con);
        this.checkedOut--;
        lock.notifyAll();
    }

    // 从连接池中获取连接
    public Connection getConnection(Object lock)
    {
        Connection con;
        while ((con = fetchConnection()) == null)// 循环调用fetchConnection()方法
        {            
            lock.wait(timeout);// 没获取到可用连接,则等待
            // 如果超时了,则return null
        }
        return con;
    }
}

// ObjectServer连接管理器
public class DBConnectionManager
{
    private Hashtable<String, DBConnectionPool> pools;// 连接池集合,每个OS域都有一个连接池
   
    private static final byte[] lock = new byte[0];// 同步锁
        
    // 返还连接
    public void freeConnection(String domainName, Connection conn)
    {
        synchronized (lock)
        {         
            DBConnectionPool pool = (DBConnectionPool) pools.get(domainName);// 得到域名对应的连接池           
            pool.freeConnection(conn, lock);         
        }
    }

    // 获得某从机上的可用连接
    public Connection getConnection(String domainName)
    {
        synchronized (lock)
        {                     
            DBConnectionPool pool = (DBConnectionPool) pools.get(domainName);

            if (null != pool)// 连接池已存在,直接使用
            {
                return pool.getConnection(lock);           
            }
            else
            {
                registerNewConnectionPool(poolProvide);// 注册新连接池
                return getConnection(domainName);// 递归调用        
            }
            return null;
        }
    }
}
分享到:
评论

相关推荐

    kafka生产者连接池

    Kafka生产者连接池是一种资源复用机制,它允许多个生产者共享一组预先建立好的连接,而不是每次发送消息时都创建新的连接。这种设计大大减少了连接创建和销毁的开销,降低了网络延迟,同时提高了系统的并发处理能力...

    连接池连接池连接池

    - **更好的并发处理**:连接池可以有效管理多个并发请求,确保每个请求都能得到及时响应。 - **故障恢复**:连接池可以检测连接状态,当发现失效连接时,能够自动回收并重新创建新的连接,保证系统的稳定运行。 ...

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的数据源信息,创建多个DataSource bean。 3. **定义路由逻辑**:创建一个继承自AbstractRoutingDataSource的自定义数据源,重写...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及如何在运行时根据上下文动态切换数据源。本知识点将围绕使用Spring AOP和Druid连接池来实现这一目标进行详细说明。 首先,要实现多数据源动态切换,...

    一个连接多种数据库的连接池封装包

    总的来说,这个连接池封装包提供了一种跨数据库的解决方案,简化了数据库连接的管理和优化,同时提供了示例和配置文件以帮助开发者快速上手。对于任何需要处理多数据库的Java应用来说,它都是一个值得考虑的工具。

    数据库连接池代码实现

    数据库连接池的概念是预先创建并维护一定数量的数据库连接,这些连接可以被多个应用程序线程复用,而不是每次需要时都去创建新的连接。这样不仅能减少数据库连接的创建和销毁开销,还能避免过多的并发连接导致数据库...

    Java 连接池源码

    首先,我们需要定义一个连接池类,这个类通常包含以下组件: 1. **连接池初始化**:在应用启动时,连接池需要初始化,这包括设置最大连接数、最小连接数、超时时间等参数,并根据这些参数创建并预分配数据库连接。 ...

    自定义JDBC连接池及常用连接池介绍

    连接池的基本思想是预先创建一定数量的数据库连接,存储在一个池中,当应用程序需要时,可以从池中获取一个已存在的连接,使用完毕后归还,而不是每次操作都创建新的连接。这样可以避免频繁的创建和销毁连接带来的...

    连接池源码和视频教程

    - 请求连接:当应用程序需要访问数据库时,不是直接创建新的连接,而是从连接池中申请一个已存在的连接。 - 使用与释放:应用程序完成数据库操作后,将连接归还给连接池,而不是直接关闭。连接池会检查连接状态,...

    delphi实现数据库连接池

    接着,为了动态创建新连接,我们需要一个方法来检查当前池中的连接是否已全部被使用,如果是,则创建新的连接并添加到池中。这个过程需要注意控制并发,防止多个线程同时创建连接,可以使用锁(如TCriticalSection)...

    oracle 数据库,在C++中用连接池实现高速连接与访问.rar

    连接池是一种数据库资源管理技术,它可以预先创建并维护一定数量的数据库连接,供多个客户端请求共享使用。这样做的好处在于减少频繁创建和销毁连接的开销,提高系统性能,并有效控制并发访问的数量,防止资源耗尽。...

    使用JAVA中的动态代理实现数据库连接池.rar_数据库连接池_连接池

    在数据库连接池的实现中,我们需要维护一个连接池,其中包含若干已建立的数据库连接。当应用程序请求连接时,连接池会从池中分配一个已打开的连接,或者在池空时创建新的连接。使用代理,我们可以确保在分配和回收...

    连接池的基本工作原理

    - **多数据库与多用户**:通过资源文件配置多个数据库的连接信息,实现连接池的实例化,每个实例对应一个特定的数据库。同时,对于同一个数据库的不同用户,也能通过资源文件管理不同的连接信息。 - **事务处理**...

    数据库连接池的工作原理

    数据库连接池的工作原理涉及到多个层面,包括连接的创建与复用、连接池的管理以及性能优化策略。接下来,我们将深入探讨这些核心知识点。 1. **连接的创建与复用** - **连接初始化**:当应用程序启动时,连接池会...

    Java 连接池多种方式配置

    Java连接池是优化数据库操作的关键技术之一,它通过复用已建立的数据库连接,避免了频繁创建和销毁连接带来的性能开销。本文将详细介绍在Java环境中配置连接池的多种方式,涵盖不同常用的Java框架。 一、C3P0连接池...

    数据库的连接池原理,基本概念及原理,服务器自带的连接池

    可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的 url 地址、用户名、密码等信息。 * 事务处理:我们知道,事务具有原子性,此时...

    mysql连接池java源码

    - **线程安全**:连接池必须是线程安全的,允许多个线程同时访问。 - **连接池的扩展性**:应支持动态调整连接池大小,以适应不同场景的需求。 - **连接验证**:在提供给应用之前,需要验证连接的有效性,防止...

    C#编写的数据库连接池

    数据库连接池是在应用程序中预先建立一组数据库连接,并将这些连接管理起来供多个请求共享。当一个请求需要连接数据库时,它会从池中获取一个已存在的连接,而不是每次都创建新的连接。使用完毕后,该连接会被归还回...

    Unidac连接池

    此外,Unidac还支持多线程环境下的连接池管理,确保在并发环境中每个线程都能安全地获取和释放连接。这通过内部的锁机制和线程同步来实现,避免了竞态条件和资源冲突。 在实际开发中,使用Unidac连接池需要注意以下...

Global site tag (gtag.js) - Google Analytics