自己写的grpc简单连接池,基于common pool2

17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift也自己写过类似的连接池,所以也不算太麻烦,之前thrift的连接池是纯手工写的,没有用第三方的连接池库,使用的时候排过几次雷,这次不想那么麻烦,所以直接就是用commons-pool2的连接池库。好了,废话不多说,直接贴代码。

第一个类GrpcSocketPool是基础的连接池类,主要是初始化连接池,配置一些常见的连接池参数,提供获取和归还连接的方法。

import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

import io.grpc.ManagedChannel;

public class GrpcSocketPool {
	private GenericObjectPool<SocketPoolBean<ManagedChannel>> objectPool = null;
	
	private String ip;
	private Integer port;
	private Integer maxTotal;
	private Integer minIdle;
	private Integer maxIdle;
	private Integer minEvictableIdleTimeMillis;
	private String channelName;

	public void init() {
		// 连接池的配置
		GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
		// 池中的最大连接数
		poolConfig.setMaxTotal(maxTotal);
		// 最少的空闲连接数
		poolConfig.setMinIdle(minIdle);
		// 最多的空闲连接数
		poolConfig.setMaxIdle(maxIdle);
		// 当连接池资源耗尽时,调用者最大阻塞的时间,超时时抛出异常 单位:毫秒数
		poolConfig.setMaxWaitMillis(10000);
		// 连接池存放池化对象方式,true放在空闲队列最前面,false放在空闲队列最后
		poolConfig.setLifo(true);
		// 连接空闲的最小时间,达到此值后空闲连接可能会被移除,默认即为30分钟
		poolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
		// 连接耗尽时是否阻塞,默认为true
		poolConfig.setBlockWhenExhausted(true);
		poolConfig.setTestOnReturn(true);
		// 连接池创建
		objectPool = new GenericObjectPool<SocketPoolBean<ManagedChannel>>(new GrpcSocketFactory(ip, port), poolConfig);
	}

	/**
	 * 从连接池获取对象
	 * @throws TradeServerException 
	 */
	public SocketPoolBean<ManagedChannel> borrowObject() throws TradeServerException {
		try {
			SocketPoolBean<ManagedChannel> bean = objectPool.borrowObject();
			return bean;
		} catch (Exception e) {
			throw new TradeServerException(ExceptionEnu.CHANNEL_ERROR);
		}
	}

	public void returnObject(SocketPoolBean<ManagedChannel> bean){
		objectPool.returnObject(bean);
	}
	
	public void destory(){
		ip = null;                         
		port = null;                      
		maxTotal = null;                  
		minIdle = null;                   
		maxIdle = null;                   
		minEvictableIdleTimeMillis = null;
		channelName = null;                
		objectPool.close();
	}

	public String getChannelName() {
		return channelName;
	}

	public void setChannelName(String channelName) {
		this.channelName = channelName;
	}
	
	@Override
	public String toString() {
		return new StringBuilder("ip:").append(ip).append(",port:").append(port).toString();
	}

	pu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过gRPC Java连接数据库,您可以按照以下步骤进行操作: 1. 首先,请确保您已经安装了gRPC Java库。您可以从官方网站或GitHub上获取最新版本。可以使用以下命令克隆gRPC Java库: `$ git clone -b v1.34.0 https://github.com/grpc/grpc-java.git` 2. 然后,根据您选择的数据库,选择适当的Java数据库连接器。常见的选择包括JDBC(Java Database Connectivity)驱动程序,例如MySQL Connector/J、PostgreSQL JDBC驱动程序等。确保您已经将它们添加到您的Java项目的依赖项中。 3. 在您的Java代码中,根据gRPC的规范和您选择的数据库的规范,创建相应的gRPC服务和方法。这将包括定义请求和响应消息以及具体的业务逻辑。 4. 在服务器端,您可以使用适当的数据库连接器来实现您的gRPC服务方法。根据您使用的数据库和连接器,您可以执行查询、插入、更新等操作,并将结果返回给客户端。 5. 在客户端,您可以使用gRPC的stub调用服务器端的方法。根据您的需求,您可以将请求的数据传递给服务器,并处理返回的结果。 需要注意的是,gRPC是一个通用的远程过程调用(RPC)框架,它可以与各种不同的后端服务进行通信,包括数据库。因此,具体的数据库连接和操作细节将由您选择的数据库和Java数据库连接器决定。 引用中提到的`option java_package = "io.grpc.examples.routeguide"`是一个gRPC的选项,用于指定生成的Java代码的包名。 引用中提到的基于OkHttp的传输是一个轻量级的传输,主要用于Android客户端。这意味着您可以选择使用OkHttp来作为gRPC的传输层,以便在Android平台上与数据库进行通信。 请根据您的实际情况和需求,选择适当的数据库连接器和gRPC传输方式,并根据它们进行相应的配置和编码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [grpc详解 java版](https://blog.csdn.net/weixin_42364391/article/details/114158369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值