java cassandra连接池_java操作cassandra(连接池)
package com.chu.cassandratest;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.apache.thrift.transport.TTransportException;
/**
* cassandra连接池
* @author chuer
* @date 2014年12月31日 上午10:05:26
*/
public class CassandraConnectionPool {
Semaphore access = null;
CassandraConnection[] pool = null;
boolean[] used = null;
int round = 0;
int conn_num = 0;
public CassandraConnectionPool(int conn_num) {
this.conn_num = conn_num;
init();
}
private void init() {
access = new Semaphore(conn_num);//有几个连接就允许有几个线程同时访问连接池。
pool = new CassandraConnection[conn_num];
used = new boolean[conn_num];
for (int i = 0; i < pool.length; i++) {
try {
pool[i] = new CassandraConnection(CassandraConnection.HOST);
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
public CassandraConnection getConn() throws InterruptedException {
if (access.tryAcquire(3, TimeUnit.SECONDS)) {
synchronized (this) {
for (int i = 0; i < pool.length; i++) {
if (!used[i]) {
used[i] = true;
return pool[i];
}
}
}
}
throw new RuntimeException("all client is too busy");
}
public void releaseConn(CassandraConnection client) {
boolean released = false;
synchronized (this) {
for (int i = 0; i < pool.length; i++) {
if (client == pool[i] && used[i]) {
used[i] = false;
released = true;
break;
}
}
}
if (released)
access.release();
}
public void shutdownPool() {
if (pool != null) {
for (int i = 0; i < pool.length; i++){
pool[i].close();
}
}
}
}
本文代码,摘抄修改于网上的另一篇文章,网络在哪里了,恕不能注明出处。
package com.chu.cassandratest;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
/**
* cassandra连接
* @author chuer
* @date 2014年12月31日 上午10:09:47
*/
public class CassandraConnection {
private Cassandra.Client client = null;
private TTransport tr = null;
private String host = null;
public final static String HOST = "127.0.0.1";
public CassandraConnection(String host) throws TTransportException {
this.host = host;
this.connect(host);
}
private synchronized void connect(String host) throws TTransportException {
tr = new TSocket(host, 9160);
TProtocol proto = new TBinaryProtocol(tr);
client = new Cassandra.Client(proto);
tr.open();
}
public synchronized void close() {
if (tr != null && tr.isOpen())
tr.close();
}
public Cassandra.Client getClient() {
return client;
}
public String getHost() {
return host;
}
}
package com.chu.cassandratest;
import org.apache.cassandra.thrift.Cassandra.Client;
public class TestCassandraPool {
public static void main(String[] args)throws Exception {
CassandraConnectionPool pool = new CassandraConnectionPool(10);
CassandraConnection conn1 = pool.getConn();
CassandraConnection conn2 = pool.getConn();
CassandraConnection conn3 = pool.getConn();
CassandraConnection conn4 = pool.getConn();
CassandraConnection conn5 = pool.getConn();
Client client1 = conn1.getClient();
Client client2 = conn2.getClient();
Client client3 = conn3.getClient();
Client client4 = conn4.getClient();
Client client5 = conn5.getClient();
System.out.println(client1);
System.out.println(client2);
System.out.println(client3);
System.out.println(client4);
System.out.println(client5);
pool.releaseConn(conn1);
pool.releaseConn(conn2);
pool.releaseConn(conn3);
pool.releaseConn(conn4);
pool.releaseConn(conn5);
}
}
输出如下:
org.apache.cassandra.thrift.Cassandra$Client@1c160cb
org.apache.cassandra.thrift.Cassandra$Client@b9b67b
org.apache.cassandra.thrift.Cassandra$Client@7b4ed7
org.apache.cassandra.thrift.Cassandra$Client@17535b6
org.apache.cassandra.thrift.Cassandra$Client@1979eb
java cassandra连接池_java操作cassandra(连接池)相关推荐
- java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解
本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...
- java中数据库连接池_Java中的数据库连接池
本文译自Baeldung的博客 概述 连接池是一种众所周知的数据库访问模式,主要目的是减少创建数据库连接和读/写数据库操作的开销. 简单来说,连接池本质上就是数据库连接缓存的一种实现方式,可以通过对其 ...
- java阿里数据库连接池_Java学习:数据库连接池技术
本节内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器中会申请一些连接对象,当用 ...
- java线程池_Java 并发编程 线程池源码实战
作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...
- java池_java中的各种池
常量池.线程池.连接池 一.常量池 1.什么是常量 是一种值,这个值本身 例如:八大基本数据类型 加字符串 不可变的变量,被final修饰的 例如 final int i=1; String str= ...
- java 队列线程池_JAVA工作队列与线程池
为什么要使用线程池? 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协议 ...
- java字节码常量池_java字节码常量池处理说明
1. 根据java的字节码格式说明,常量池中每一项的大小不一样的.运行时,若要通过数组索引获取具体的一项时, 必须要经过一定的处理才能根据数组下标进行处理,具体的实现原理实际上就是空间换时间,可以参考 ...
- java 批量增删改_java使用JDBC连接mysql并且进行批量增删改操作
在处理百万级的数据时,经常需要对数据库中的数据进行增删改查操作,由于数据量大,进行Query的时候在效率上还是可以接受,但进行增删改的时候,如果采用一次一条记录操作,则效率大大的降低,因此,需要进行批 ...
- java druid mysql连接池_java使用Druid连接池连接mysql
1.先在mysql创建需要的数据库和表 use book; create table t_user( `id`intprimary key auto_increment, `username` var ...
最新文章
- DEDE列表缩图中 给缩图添加alt锚文本信息的方法
- MapReduce学习总结之Combiner、Partitioner、Jobhistory
- Unity VR游戏开发干货教程:优化VR体验
- 使用机器学习预测天气_如何使用机器学习根据文章标题预测喜欢和分享
- echarts柱状图x轴文字纵向显示
- java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
- gdb java,调用gdb来调试java程序
- 《设计模式详解》设计模式概述、UML
- mysql 小类型_mysql数据类型
- 正则匹配新闻内容案例,JS和PHP
- 路由器k2固件改系统时间
- 【python技巧】RGB值组合三元色(红绿蓝)
- python列表找大写字母_使用Python实现将list中的每一项的首字母大写
- Hive 根据身份证规则从身份证号提取年龄和性别
- Unity3d Mesh、Texture、UI 压缩降低内存
- 链传动运动仿真(motion分析)制作包含源文件
- ramdump,QPST
- 筛选状态下进行复制粘贴为数值
- H5和webview跳转小程序
- SRC小技巧:批量查询网站权重
热门文章
- python编码器_自编码器和分类器python
- eclipse编写wordcount提交spark运行
- hive复合数据类型之map
- Uber如何使用go语言创建高效的查询服务
- 汽车和山羊问题matlab仿真_Matlab----无人机集群对抗中的关键问题和仿真平台(开发中)案例...
- python删除过期文件_python删除过期文件的方法
- matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数
- mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?
- oracle asm 删除diskgroup,ASM磁盘组删除DISK操作
- python打印九九加法表_Python小脚本