`
san_yun
  • 浏览: 2639546 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

实现一个连接池

 
阅读更多
在程序中大部分对象都不需要重复利用,每次用完直接丢弃就可以了,但有一种对象不能这样做---TCP connection(socket),socket如果每次用完直接关闭会导致几个问题:
1.netstat 看TIME_WAIT或CLOSE_WAIT非常高。
2.每次重新建立连接需要消耗资源。

通过实现连接池能比较好的解决这个问题,redis,mongo客户端都实现了连接池,通过apache-common提供的object pool也能实现一个比较好的连接池,下面是模仿redis-py实现的一段连接池。




import threading
from time import sleep
import sys

class Connection(object):
	def __init__(self):
		self.conn = "conn"

class ConnectionPool(object):  
	def __init__(self):
		self.max_connections = 10
		self._created_connections = 0  
		self._available_connections = []  
		self._in_use_connections = set()  

	def get_connection(self):
		try: 
			connection = self._available_connections.pop()  
		except IndexError:  
			connection = self.make_connection()
		self._in_use_connections.add(connection)
		return connection  

	def make_connection(self):
		
		if self._created_connections >= self.max_connections:  
			raise Error("Too many connections")  
		self._created_connections += 1  
		return Connection() 

	def release(self, connection):  
		
		self._in_use_connections.remove(connection)  
		self._available_connections.append(connection)
	
class TestThread(threading.Thread):
	def __init__(self,testobj):
		threading.Thread.__init__(self)
		self.pool = testobj

	def run(self):
		while True:
			connect = self.pool.get_connection()
			sleep(1)			
			self.pool.release(connect)
			#print  str(self.pool._created_connections)+":"+str(len(self.pool._in_use_connections))

test = ConnectionPool()

for i in xrange(8):
	t = TestThread(test)
	t.start()  

  • 大小: 30.2 KB
分享到:
评论

相关推荐

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

    5. **连接池管理**:为了更好地管理连接资源,我们需要实现一个连接池类,用于维护活跃连接的数量,并提供获取和归还连接的功能。 ```java public class ConnectionPool { private List<Connection> connections ...

    数据库连接池代码实现

    在本文中,我们将探讨如何实现一个简单的数据库连接池。首先,我们需要理解几个关键概念: 1. **连接池初始化**:在程序启动时,连接池会根据配置预先创建一定数量的数据库连接。这些连接在空闲时会被保存起来,...

    java socket连接池 实现

    以下是一个简单的Socket连接池实现步骤: 1. 初始化连接池:设置最大连接数、最小连接数、超时时间等参数,并预创建一部分Socket连接。 2. 获取连接:当应用程序需要建立Socket连接时,从连接池中获取一个闲置的...

    c# mysql数据库连接池实现

    在.NET Core中,对于MySQL数据库,我们可以使用`MySql.Data`或`Pomelo.EntityFrameworkCore.MySql`库来实现连接池。 1. 安装依赖库 使用NuGet包管理器安装`Pomelo.EntityFrameworkCore.MySql`或者`MySql.Data`。`...

    连接池案例 连接池案例

    2. 获取连接:当程序需要访问数据库时,不再直接创建新连接,而是从连接池中获取一个已存在的连接。 3. 使用与归还:程序使用完连接后,不关闭它,而是将其归还到连接池,供其他请求使用。 4. 监控与调整:连接池会...

    okhttp中连接池实现

    1. **连接对象的添加**:当一个请求被发送时,OkHttp会检查连接池中是否存在可用于该请求的连接。如果存在,就直接使用;否则,会创建一个新的TCP连接并将其添加到连接池中。这个过程涉及到对目标主机、端口和协议的...

    自己实现的ActiveMQ连接池和新版本ActiveMQ自带的连接池,封装好的工具类,可直接使用

    本资源提供的内容是关于ActiveMQ的连接池实现,分为两部分:一是作者自己实现的ActiveMQ连接池,二是新版本ActiveMQ自带的连接池。连接池是一种资源管理技术,通过复用已建立的数据库连接或网络连接,减少创建和销毁...

    Java 连接池实现

    - **C3P0**:提供了一个强大的连接池实现,支持连接测试、自动回收、自动扩展等功能。 - **DBCP**(Apache Commons DBCP):Apache基金会的一个项目,提供了基本的连接池功能。 - **HikariCP**:被广泛认为是目前最...

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

    socket 客户端连接池实现

    在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或ConcurrentHashMap的数据结构来管理和维护连接。同时,可以结合JMX(Java Management Extensions)进行监控,查看连接...

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

    3. 获取连接:当需要访问数据库时,从连接池中获取一个已建立的连接,而不是每次都新建。 4. 使用连接:执行SQL语句,处理数据,执行事务。 5. 归还连接:操作完成后,不应立即关闭连接,而是将其归还给连接池,供...

    数据库连接池java代码实现

    本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释其核心概念和工作原理。 连接池的基本思想是维护一组预初始化的数据库连接,当应用程序需要时,可以从池中获取一个连接,使用完毕后,再归还回...

    java ftp连接池

    在Java中,`commons-pool`库是一个广泛使用的对象池框架,它可以用于构建各种类型的连接池,包括FTP连接池。`commons-pool`提供了基础的池化机制,开发者需要根据FTP协议实现具体的FTP连接对象和管理策略。 在实际...

    java实现连接池

    Java实现连接池是一种提高数据库操作效率的技术,它通过管理和重用数据库连接,避免了频繁创建和销毁连接导致的性能开销。在Java中,我们通常使用第三方库来实现连接池,如Apache的DBCP、C3P0,或者更现代的HikariCP...

    数据库连接池的一个简单实现

    3. **实现连接池管理**:创建一个`ConnectionPool`类,包含初始化连接池的方法(根据配置创建初始连接),以及获取和归还连接的方法。这里需要实现线程安全的连接分配和回收逻辑。 4. **异常处理**:在获取和释放...

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

    在C#中,可以使用`System.Data.Common.DbConnection`作为基类,创建自定义的数据库连接类,然后在此基础上实现连接池逻辑。 4. **源码分析**: `ConnectionPool.sln`是解决方案文件,包含项目的整体配置和依赖关系...

    kafka生产者连接池

    Kafka生产者连接池可能会使用这个库来实现连接的创建、管理和回收。对象池的基本操作包括获取对象、返回对象、检测空闲对象以及定期检查和清理过期对象等。 `kafkaPool-v1.0.jar`可能是实现Kafka生产者连接池的...

    delphi实现数据库连接池

    如果选择自定义,我们需要设计一个类来维护连接列表,同时实现连接的创建、释放和线程安全的获取。 首先,我们需要初始化连接池,设定池中连接的最大数量。这通常在应用程序启动时完成,可以根据预期的并发用户数和...

Global site tag (gtag.js) - Google Analytics