实现一个非常基础的TCP连接池,仅作参考。呵呵。
import java.net.Socket;
import java.util.Hashtable;
/**
* 简单TCP连接池的实现
* @author wakin
*
*/
public class ConnectionPool
{
private static final int CONNECTION_POOL_SIZE = 10; //全局常量
private static final String API_SERVER_HOST = "127.0.0.1";
private static final int API_SERVER_PORT = 8888;
private static ConnectionPool self = null;
private Hashtable<Integer, Socket> socketPool = null; //连接池
private boolean [] socketStatusArray = null; //连接的状态(true-被占用,false-空闲)
/**
* 初始化连接池,最大TCP连接的数量为10
*/
public static synchronized void init() {
self = new ConnectionPool();
self.socketPool = new Hashtable<Integer, Socket>();
self.socketStatusArray = new boolean [CONNECTION_POOL_SIZE];
//初始化连接池
System.out.println("初始化连接池.");
buildConnectionPool();
}
/**
* 建立连接池
*/
public synchronized static void buildConnectionPool() {
if(self==null)
init();
System.out.println("准备建立连接池.");
Socket socket = null;
try {
for(int i=0;i<CONNECTION_POOL_SIZE;i++){
socket = new Socket(API_SERVER_HOST,API_SERVER_PORT);
self.socketPool.put(new Integer(i), socket);
self.socketStatusArray[i] = false;
}
} catch (Exception e) {
System.out.println("连接池建立失败!");
throw new RuntimeException(e); //抛出
}
System.out.println("连接池建立成功.");
}
/**
* 从连接池中获取一个空闲的Socket
* @return 获取的TCP连接
*/
public static Socket buildConnection(){
if(self==null)
init();
int i = 0;
for(i=0;i<CONNECTION_POOL_SIZE;i++){
if(!self.socketStatusArray[i]){
self.socketStatusArray[i] = true;
break;
}
}
if(i<=CONNECTION_POOL_SIZE) {
System.out.println("连接池中的第"+i+"个连接");
return self.socketPool.get(new Integer(i));
}
else {
System.out.println("从连接池建立连接失败,没有空闲的连接");
throw new RuntimeException("No enough pooled connection");
}
}
/**
* 当获得的socket不可用时,重新获得一个空闲的socket。
* @param socket 不可用的socket
* @return 新得到的socket
*/
public static Socket rebuildConnection(Socket socket) {
if(self==null)
init();
Socket newSocket = null;
try {
for(int i=0;i<CONNECTION_POOL_SIZE;i++) {
if(self.socketPool.get(new Integer(i))==socket){
System.out.println("重建连接池中的第"+i+"个连接");
newSocket = new Socket(API_SERVER_HOST,API_SERVER_PORT);
self.socketPool.put(new Integer(i), newSocket);
self.socketStatusArray[i] = true;
}
}
} catch (Exception e) {
System.out.println("重建连接失败!");
throw new RuntimeException(e);
}
return newSocket;
}
/**
* 将用完的socket放回池中,调整为空闲状态。此时连接并没有断开。
* @param socket 使用完的socket
*/
public static void releaseConnection(Socket socket){
if(self==null){
init();
}
for(int i=0;i<CONNECTION_POOL_SIZE;i++){
if(self.socketPool.get(new Integer(i))==socket){
self.socketStatusArray[i] = false;
System.out.println("释放连接 "+i);
break;
}
}
}
/**
* 断开池中所有连接
*/
public synchronized static void releaseAllConnection() {
if(self==null)
init();
//关闭所有连接
Socket socket = null;
for(int i=0;i<CONNECTION_POOL_SIZE;i++){
socket = self.socketPool.get(new Integer(i));
try {
socket.close();
self.socketStatusArray[i] = false;
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("全部连接已经关闭。");
}
/**
* 重新建立连接池。
*/
public static void reset() {
self = null;
System.out.println("重建连接池...");
init();
}
}
分享到:
相关推荐
Go-gpool是一个专门为Go语言设计的TCP连接池库,它实现了对`net.Conn`接口的兼容,使得开发者能够方便地在自己的TCP应用中利用连接池技术来提高性能和效率。在Go语言的网络编程中,连接池是一个重要的优化手段,尤其...
否则,会创建一个新的TCP连接并将其添加到连接池中。这个过程涉及到对目标主机、端口和协议的匹配,确保连接能被正确地重用。 2. **连接对象的移除**:连接池中的连接不是无限期保留的。OkHttp有一套策略来决定何时...
具体实现时,我们可以设计一个连接池类,包含以下几个核心部分: 1. 初始化:设置最大连接数,初始化空闲连接列表。 2. 获取连接:当有新的网络请求时,从连接池中取出一个可用的Socket,如果没有则等待或创建新的...
在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或ConcurrentHashMap的数据结构来管理和维护连接。同时,可以结合JMX(Java Management Extensions)进行监控,查看连接...
连接池的核心思想是减少频繁的资源分配与释放,通过复用已存在的连接,避免了频繁的TCP三次握手和四次挥手过程,提升了整体系统的稳定性和效率。 Apache Commons Pool 2(在提供的文件`commons-pool2-2.3.jar`中)...
常连接是指一个持久存在的TCP连接,避免了频繁创建和销毁连接带来的系统资源消耗和性能损耗。然而,当应用需要与多个后台服务交互时,传统的串行处理模式(即逐一访问每个服务)会导致性能瓶颈和系统健壮性下降。 ...
2. 借用与归还:当客户端请求到来时,服务器从连接池中取出一个已建立的Socket连接,用于处理请求。完成后,不再关闭连接,而是将其归还到池中,供后续请求使用。 3. 管理:连接池管理器负责维护池中连接的状态,...
- **连接复用**:当客户端请求到来时,从连接池中取出一个空闲连接,进行数据交互,完成后并不关闭,而是放回连接池,供后续请求使用。 - **连接管理**:连接池会监控每个连接的状态,确保连接的有效性,如果发现有...
### Socket连接池的简单应用 #### 一、引言 在网络通信中,Socket作为一种基本的通信方式被广泛应用。然而,在实际开发过程中,直接使用系统自带的Socket库可能会遇到各种复杂性和性能上的挑战。例如,频繁地建立...
- 当执行一个SQL命令时,如果没有连接池,那么每次都需要经历完整的连接和断开过程,这包括TCP连接的三次握手、数据库认证的三次握手、SQL执行、数据库关闭以及TCP的四次挥手关闭。这种方式虽然实现简单,但是存在...
以下是一个简单的ActiveMQ连接池工具类的伪代码: ```java public class ActiveMQPoolUtil { private static PooledConnectionFactory factory; private static Connection connection; static { // 初始化...
在“QT支持多客户端链接TCP服务器,外带数据库连接池”这个项目中,我们将探讨如何利用QT库构建一个能同时处理多个客户端连接的TCP服务器,并有效地管理数据库连接。 首先,我们要构建TCP服务器,这主要依赖于QT的...
总的来说,基于MINA的UDP数据库连接池实现了高效、可靠的UDP数据接收和数据库操作,利用了MINA的异步特性、线程池的并发处理能力以及数据库连接池的资源复用,有效解决了UDP通信与数据库交互中的性能和稳定性问题。...
TCP连接池,即TCP连接复用技术,是在应用中维护一个连接集合,供多个请求复用,避免了频繁创建和销毁TCP连接的开销。TCP连接池可以显著提高系统性能,减少网络延迟,提高并发处理能力,并有助于控制最大并发连接数,...
3. **创建并启动线程**:在每个线程中,我们可以从连接池中获取一个可用的Socket对象,执行相应的网络操作,例如发送数据或接收响应。完成操作后,必须将Socket对象归还到连接池中,以便其他线程可以重复使用。 4. ...
在这个项目中,我们关注的是如何利用Java NIO来实现一个异步连接池。连接池是一种优化资源管理的技术,它通过复用已建立的数据库或其他网络连接,避免频繁地创建和销毁连接,从而提高系统性能。 异步连接池的核心...
* 多线程通过`套接字通信`取出连接池中的一个连接,然后和服务器直接进行通信,通信之后再将此连接`还给连接池`(减少数据库连接和断开的次数) * 数据库连接池对应C++中的一个数据库连接对象,即`单例模式` * 连接池...
- **定义**:TADOPool 类实现了一个数据库连接池,可以复用已经建立的数据库连接。 - **属性**: - `FSection`: 临界区对象,用于同步对连接池的操作。 - `FPoolNumber`: 连接池中的连接数量。 - `...
3. **使用连接池**:连接池是一种管理TCP连接的机制,它允许多个应用程序共享有限数量的连接,而不是每个应用都创建新的连接。这种方式可以有效地利用有限的连接资源,并减少建立和关闭连接的开销。 4. **代理...
标题提到的"一个非常简洁的网络连接池,可以通过他来构建特定协议的连接池",这通常指的是一个轻量级、易于使用的库,它允许开发者为特定的网络协议(如HTTP、TCP、MySQL等)创建和管理连接池。这样的工具可以极大地...