系统场景:系统依赖多个数据库。其中一台数据库服务器运行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生产者连接池是一种资源复用机制,它允许多个生产者共享一组预先建立好的连接,而不是每次发送消息时都创建新的连接。这种设计大大减少了连接创建和销毁的开销,降低了网络延迟,同时提高了系统的并发处理能力...
2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的数据源信息,创建多个DataSource bean。 3. **定义路由逻辑**:创建一个继承自AbstractRoutingDataSource的自定义数据源,重写...
该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及如何在运行时根据上下文动态切换数据源。本知识点将围绕使用Spring AOP和Druid连接池来实现这一目标进行详细说明。 首先,要实现多数据源动态切换,...
总的来说,这个连接池封装包提供了一种跨数据库的解决方案,简化了数据库连接的管理和优化,同时提供了示例和配置文件以帮助开发者快速上手。对于任何需要处理多数据库的Java应用来说,它都是一个值得考虑的工具。
接着,为了动态创建新连接,我们需要一个方法来检查当前池中的连接是否已全部被使用,如果是,则创建新的连接并添加到池中。这个过程需要注意控制并发,防止多个线程同时创建连接,可以使用锁(如TCriticalSection)...
数据库连接池的概念是预先创建并维护一定数量的数据库连接,这些连接可以被多个应用程序线程复用,而不是每次需要时都去创建新的连接。这样不仅能减少数据库连接的创建和销毁开销,还能避免过多的并发连接导致数据库...
首先,我们需要定义一个连接池类,这个类通常包含以下组件: 1. **连接池初始化**:在应用启动时,连接池需要初始化,这包括设置最大连接数、最小连接数、超时时间等参数,并根据这些参数创建并预分配数据库连接。 ...
连接池的基本思想是预先创建一定数量的数据库连接,存储在一个池中,当应用程序需要时,可以从池中获取一个已存在的连接,使用完毕后归还,而不是每次操作都创建新的连接。这样可以避免频繁的创建和销毁连接带来的...
- 请求连接:当应用程序需要访问数据库时,不是直接创建新的连接,而是从连接池中申请一个已存在的连接。 - 使用与释放:应用程序完成数据库操作后,将连接归还给连接池,而不是直接关闭。连接池会检查连接状态,...
此外,Unidac还支持多线程环境下的连接池管理,确保在并发环境中每个线程都能安全地获取和释放连接。这通过内部的锁机制和线程同步来实现,避免了竞态条件和资源冲突。 在实际开发中,使用Unidac连接池需要注意以下...
连接池是一种数据库资源管理技术,它可以预先创建并维护一定数量的数据库连接,供多个客户端请求共享使用。这样做的好处在于减少频繁创建和销毁连接的开销,提高系统性能,并有效控制并发访问的数量,防止资源耗尽。...
在数据库连接池的实现中,我们需要维护一个连接池,其中包含若干已建立的数据库连接。当应用程序请求连接时,连接池会从池中分配一个已打开的连接,或者在池空时创建新的连接。使用代理,我们可以确保在分配和回收...
- **多数据库与多用户**:通过资源文件配置多个数据库的连接信息,实现连接池的实例化,每个实例对应一个特定的数据库。同时,对于同一个数据库的不同用户,也能通过资源文件管理不同的连接信息。 - **事务处理**...
数据库连接池的工作原理涉及到多个层面,包括连接的创建与复用、连接池的管理以及性能优化策略。接下来,我们将深入探讨这些核心知识点。 1. **连接的创建与复用** - **连接初始化**:当应用程序启动时,连接池会...
Java连接池是优化数据库操作的关键技术之一,它通过复用已建立的数据库连接,避免了频繁创建和销毁连接带来的性能开销。本文将详细介绍在Java环境中配置连接池的多种方式,涵盖不同常用的Java框架。 一、C3P0连接池...
可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的 url 地址、用户名、密码等信息。 * 事务处理:我们知道,事务具有原子性,此时...
- **线程安全**:连接池必须是线程安全的,允许多个线程同时访问。 - **连接池的扩展性**:应支持动态调整连接池大小,以适应不同场景的需求。 - **连接验证**:在提供给应用之前,需要验证连接的有效性,防止...
数据库连接池是在应用程序中预先建立一组数据库连接,并将这些连接管理起来供多个请求共享。当一个请求需要连接数据库时,它会从池中获取一个已存在的连接,而不是每次都创建新的连接。使用完毕后,该连接会被归还回...
总之,Delphi数据库连接池是提高数据库应用性能和效率的重要手段,其设计和实现涉及到数据库访问技术、资源管理策略等多个方面,是Delphi开发中的高级话题。通过理解和掌握这一技术,开发者能够更好地构建高性能、高...