实现一个非常基础的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();
}
}
分享到:
相关推荐
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...
* 多线程通过`套接字通信`取出连接池中的一个连接,然后和服务器直接进行通信,通信之后再将此连接`还给连接池`(减少数据库连接和断开的次数) * 数据库连接池对应C++中的一个数据库连接对象,即`单例模式` * 连接池...
在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927
因为TCP的三只握手等等原因...实现简单的连接池 type Pool struct { m sync.Mutex // 保证多个goroutine访问时候,closed的线程安全 res chan io.Closer //连接存储的chan factory func() (io.Closer,error) //新
本项目应用了muduo网络库、nginx的TCP负载均衡、中间件reids的发布订阅功能、数据库连接池(自制),实现了集群部署聊天服务器 本项目应用了muduo网络库、nginx的TCP负载均衡、中间件reids的发布订阅功能、数据库连接...
每次需要建立一个新的数据库连接时,效率低下,并且可能在高流量的情况下导致资源耗尽。 连接池维护与数据库的一组开放连接,并将其分发以供重复使用。 r2d2与其管理的连接类型无关。 ManageConnection特征的实现者...
可以工作在 nginx tcp 负载均衡环境中的集群聊天服务器和客户端源码 基于 muduo,nginx,redis 实现 添加了数据库连接池提高了并发能力,并且降低了聊天延迟 可以工作在 nginx tcp 负载均衡环境中的集群聊天服务器和...
首先要了解为什么用连接...由于PHP是单进程单线程的,使用PHP实现数据库连接池,肯定需要用单独的进程去做,那么就会涉及到进程间的通讯,使得原本和mysql直接通讯的过程变成 与连接池再到mysql的通讯,增加了应用端的
考虑到服务器端如果每接收到一个请求fork一个进程处理方式的效率低,服务器端采用进程池方式,结合libevent网络库,可以处理并发的TCP连接请求,另外实现了一个基于mysqlclient接口的连接池。 希望对你的 C++ 学习有...
这是一个简单的示例,演示了如何创建TCP客户端以及连接池的行为。 {-# LANGUAGE OverloadedStrings #-} module Main ( main ) where import Control.Concurrent ( forkIO , newEmptyMVar , putMVar , readMVar ...
主要给大家介绍了关于golang实现基于channel的通用连接池的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
DNS:名字服务器 48 6.1 域名系统概述 48 6.2 授权局 50 6.3 DNS分布数据库 50 6.4 域和区 50 6.5 Internet顶级域 51 6.6 选择一个域名服务器 52 6.7 名字服务解析过程 52 6.7.1 递归查询 ...
本实验采用LWIP的RAW编程方法实现TCP Server功能,默认开启DHCP自动获取IP地址。电脑端打开网络调试助手,网络调试助手做客户端,所以选择TCP Client协议。开发板做TCP服务器。
6.6 选择一个域名服务器 52 6.7 名字服务解析过程 52 6.7.1 递归查询 52 6.7.2 叠代查询 52 6.8 高速缓存 52 6.9 反向解析(Pointer)查询 52 6.10 DNS安全 52 6.11 资源记录 53 6.12 小结 54 第7章 WINS 55 7.1 ...
6.6 选择一个域名服务器 52 6.7 名字服务解析过程 52 6.7.1 递归查询 52 6.7.2 叠代查询 52 6.8 高速缓存 52 6.9 反向解析(Pointer)查询 52 6.10 DNS安全 52 6.11 资源记录 53 6.12 小结 54 第7章 WINS 55 7.1 ...
易语言后端服务框架,需要用到TCP协议,MYSQL数据库的可以使用这个框架。完美实现多线程并发交互,抗超高并发。使用简单,只需在收到数据后指定位置写代码即可。框架自动进行负载均衡调用处理线程池与MYSQL连接池。
sockerl:Sockerl是用于TCP协议的高级ErlangElixir套接字框架,并提供了快速,有用和易于使用的API,用于实现服务器,客户端和客户端连接池
多个客户端连接服务,并实现回声功能。用于实验
- 内置连接池,具备更高的性能,低延迟 QPS: 5w+ - 支持自动重连功能 - Client支持Ha的负载均衡功能 - 支持附件发送 - 压缩功能,支持GZip与Snappy - 支持多包拆分与合并功能 - 支持多级超时设定,灵活控制请求超时...