[This blog was syndicated from http://nitschinger.at/]
Para todos los usuarios de nuestro Java SDK, hemos preparado algunas buenas adiciones para usted. Este post los cubre en detalle y muestra cómo se puede obtener más productivo
Tenga en cuenta que esta entrada de blog asume que está ejecutando la versión 1.2.1, ya que ha habido algunos pequeños cambios entre 1.2.0 y 1.2.1 que afectan, por ejemplo, al soporte de oyentes y a la recopilación de métricas.
Distribución central de Maven
Desde la versión 1.2.0 en adelante, el Java SDK se distribuye directamente desde Maven Central. Esto significa que ya no necesitas incluir el repositorio de Couchbase. El siguiente código maven es suficiente para empezar (ten en cuenta que el groupId ha cambiado):
<dependencia>
<idGrupo>com.couchbase.client>
<artifactId>couchbase-client>
<versión>1.2.1>
>
>
Esto cargará automáticamente la última dependencia de spymemcached también (para 1.2.0 es 2.10.0). Antes de profundizar en lo que ha cambiado, aquí son las notas de la versión para una referencia rápida.
Soporte para oyentes
OperaciónFuturo<Booleano> setFuture = cliente.configure("llave", "valor");
// bloquear el hilo actual
Booleano resultado = setFuture.consiga();
para (int i = 0; i < 100; i++) {
futuros.añada(cliente.configure("llave-" + i, "valor"));
}
mientras que (!futuros.isEmpty()) {
Iterador<OperaciónFuturo<Booleano>> iter = futuros.iterador();
mientras que (iter.hasNext()) {
OperaciónFuturo<Booleano> futuro = iter.siguiente();
si (futuro.isDone()) {
iter.eliminar();
}
}
}
.get()
en el futuro ya no se bloqueará porque el resultado ya se ha calculado. Cualquier cosa que pongas en el método callback se ejecutará de forma asíncrona en el thread pool. Para ver lo flexible que es este enfoque, vamos a reescribir el ejemplo anterior esperando hasta que los 100 futuros hayan terminado.para (int i = 0; i < 100; i++) {
OperaciónFuturo<Booleano> futuro = cliente.configure("llave-" + i, "valor");
futuro.addListener(nuevo OperationCompletionListener() {
@Override
público void onComplete(OperaciónFuturo<?> futuro) lanza Excepción {
Picaporte.countDown();
}
});
}
Picaporte.await();
ServicioEjecutor
con una personalizada. Esto puede ser necesario si el comportamiento por defecto (Básicamente un cachedThreadPool de límite superior) no se ajusta a tus necesidades. Además, deberías usar este enfoque si creas un montón de CouchbaseClient
para poder compartir el mismo servicio en todas ellas.Constructor de CouchbaseConnectionFactoryBuilder = nuevo CouchbaseConnectionFactoryBuilder();
// Crear un pool de hilos de 5 hilos fijos
Servicio ExecutorService = Ejecutores.newFixedThreadPool(5);
// Configurarlo en el constructor
constructor.setListenerExecutorService(servicio);
// Crear la instancia
Cliente CouchbaseClient = nuevo CouchbaseClient(constructor.buildCouchbaseConnection(…));
Capacidades mejoradas de elaboración de perfiles
<idGrupo>com.codahale.metrics>
<artifactId>métrica-núcleo>
<versión>3.0.1>
>
// activar la recogida de métricas
constructor.setEnableMetrics(MetricType.RENDIMIENTO);
TipoMétrico
puedes ver que hay tres tipos de valores entre los que puedes elegir: OFF (que mantiene la recogida de métricas desactivada), PERFORMANCE (que sólo recoge métricas relevantes para el rendimiento) y DEBUG (que recoge todo tipo de métricas, incluyendo las de rendimiento). Aunque la librería de métricas es bastante eficiente, ten en cuenta que la recogida de métricas consume algunos recursos de tu aplicación.constructor.setEnableMetrics(MetricType.RENDIMIENTO);
CouchbaseConnectionFactory cf =
constructor.buildCouchbaseConnection(Matrices.asList(nuevo URI(“http://127.0.0.1:8091/pools”)), "por defecto", “”);
Cliente CouchbaseClient = nuevo CouchbaseClient(cf);
mientras que(verdadero) {
cliente.configure("foo", "bar");
Hilo.dormir(100);
}
- Histogramas ----------------------
[MEM] Promedio de Bytes leídos del SO por lectura
recuento = 893
mín = 24
máx = 24
media = 24,00
stddev = 0.00
mediana = 24,00
75% <= 24.00
95% <= 24.00
98% <= 24.00
99% <= 24.00
99,9% <= 24,00
[MEM] Promedio de bytes escritos en el SO por escritura
recuento = 893
mín = 38
máx = 38
media = 38,00
stddev = 0.00
mediana = 38,00
75% <= 38.00
95% <= 38.00
98% <= 38.00
99% <= 38.00
99,9% <= 38,00
[MEM] Tiempo medio en el cable para las operaciones (µs)
recuento = 893
mín = 179
máx = 1730
media = 263,80
stddev = 75,43
mediana = 251,00
75% <= 280.00
95% <= 351.90
98% <= 425.36
99% <= 559,70
99,9% <= 1730,00
- Metros ------------------------
[MEM] Tasa de solicitud: Todos
recuento = 893
tasa media = 9,92 eventos/segundo
Tasa de 1 minuto = 9,85 eventos/segundo
Tasa de 5 minutos = 9,68 eventos/segundo
Tasa de 15 minutos = 9,63 eventos/segundo
[Tasa de respuesta: Todas (Fallo + Éxito + Reintento)
recuento = 893
tasa media = 9,92 eventos/segundo
Tasa de 1 minuto = 9,85 eventos/segundo
Tasa de 5 minutos = 9,68 eventos/segundo
Tasa de 15 minutos = 9,63 eventos/segundo
net.spy.metrics.reporter.type=jmx
. Otros ajustes posibles son csv
y slf4j. Si elige un registrador que imprime información a un intervalo determinado, puede cambiarlo configurando
net.spy.metrics.reporter.interval a nada más que 30.
antes del código mostrado arriba, puedes abrir (por ejemplo) jConsole y cambiar a la pestaña MBeans de la aplicación. Verás un
métricas subsección expuesta que contiene las mismas métricas que aparecerían en los registros.
CAS con caducidad
actualizar y establecer una nueva caducidad al mismo tiempo. Tuvo que hacer una segunda
toque que no era eficiente ni atómica. Ahora, la API expone un nuevo
cas() que permite introducir al mismo tiempo la hora de expiración. Es fácil de utilizar:
Inicialización mediante propiedades
en función de las propiedades del sistema. He aquí un ejemplo:
Sistema.setProperty("cbclient.bucket", "por defecto");
Sistema.setProperty("cbclient.password", "");
Constructor de CouchbaseConnectionFactoryBuilder = nuevo CouchbaseConnectionFactoryBuilder();
CouchbaseConnectionFactory cf = constructor.buildCouchbaseConnection();
Cliente CouchbaseClient = nuevo CouchbaseClient(cf);
at com.couchbase.client.CouchbaseConnectionFactory.(CouchbaseConnectionFactory.java:160)
at com.couchbase.client.CouchbaseConnectionFactoryBuilder$2.(CouchbaseConnectionFactoryBuilder.java:318)
at com.couchbase.client.CouchbaseConnectionFactoryBuilder.buildCouchbaseConnection(CouchbaseConnectionFactoryBuilder.java:318)
at Principal.main(Principal.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Método Nativo)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Otros cambios
y
PersistTo se ha reducido a
10 ms para tener en cuenta los cambios de rendimiento que se introdujeron en la versión 2.2 de Couchbase Sever. Además, el cliente ahora utiliza el
Mecanismo de autenticación CRAM-MD5` automáticamente si el servidor lo soporta (desde 2.2 también).
[...] Blog de la semana: Novedades en Couchbase Java SDK 1.2 [...]