KDB Connection Pool
TCP μμΌμ΄ μ°κ²°λ μνλ‘ λ¨μμλ TCP 컀λ₯μ λμ λ¬Έμ λ₯Ό κ²½ννκ³ λμ 컀λ₯μ ν κΈ°λ₯ ꡬνμ λν΄μ λ€μνλ² νμ΅ν΄λ³΄κ³ μ 리νλ κΈμ λλ€.
μλ§λ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ μμ£Ό μ¬μ©λλ μΌλΆ λ°μ΄ν°λ² μ΄μ€λ€μ λν 컀λ₯μ ν κΈ°λ₯μ μ§μ ꡬννμ§ μμλ λλ κ²½μ°κ° λ§μ΅λλ€. μμ€ν μμ μ¬μ©μ€μΈ μκ³μ΄ λ°μ΄ν°λ² μ΄μ€λ μλ° ν΄λΌμ΄μΈνΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ 곡νκ³ μμ§λ§ μκ³μ΄ λ°μ΄ν°λ² μ΄μ€κ° λ¨μΌ μμ²μ μμ°¨μ μΌλ‘ μ²λ¦¬νλ μ±κΈ μ€λ λ λ°©μμμ λ°λΌμ 컀λ₯μ ν κΈ°λ₯μ μ체μ μΌλ‘ λ΄μ₯νκ³ μμ§ μμ΅λλ€. 컀λ₯μ ν κΈ°λ₯μ΄ λ°λμ νμν κ²μ μλμ§λ§ TCP μ°κ²°μ λν λΆνλ₯Ό μκ°νλ€λ©΄ μμ£Ό TCP μμΌμ μ°κ²°νλ―λ‘ λ°μν μ μλ λ μ΄ν΄μλ₯Ό λ° μμ λλΉλ₯Ό 무μν μ μμ΅λλ€.
μλ° μ»€λ₯μ ν λΌμ΄λΈλ¬λ¦¬
μλ° μ ν리μΌμ΄μ μ λλΆλΆ Apache Commons Pool2 λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν΄μ 컀λ₯μ ν κΈ°λ₯μ ꡬννλ κ²½μ°κ° λ§μ΅λλ€. λνμ μΌλ‘ λ λμ€ ν΄λΌμ΄μΈνΈλ‘ λ§μ΄ μ¬μ©μ€μΈ Lettuceμ 컀λ₯μ ν μ§μμ νμΈν μ μμΌλ©° Apache Commons DBCP2λΌκ³ νλ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ λν λνμ μΈ μ»€λ₯μ ν λΌμ΄λΈλ¬λ¦¬λ Commons Poolλ‘ κ΅¬νλμ΄μμμ νμΈν μ μμ΅λλ€.
Apache Commons Pool2μμλ κ°λ¨ν PooledObjectFactory μμ λ₯Ό μ 곡νκ³ μμ§λ§ μμΈν μ€λͺ μ΄ μμ΅λλ€.
컀λ₯μ ν ꡬν μμ λ₯Ό κ²μν΄λ³΄λ©΄ μκ°λ³΄λ€ κ΄λ ¨λ κΈμ΄ μμκΈ°μ μ§μ μ μΌλ‘ 컀λ₯μ ν κΈ°λ₯μ ꡬννλ κ°λ°μλ λ§μ§ μμ κ²μ΄λΌ μκ°λ©λλ€. 컀λ₯μ μ€λΈμ νΈμ λν λΌμ΄ν μ¬μ΄ν΄μ κ΄λ¦¬νλ κ²μ PooledObjectFactory μΈν°νμ΄μ€κ° λ΄λΉνλ―λ‘ μνλ 컀λ₯μ ν λμμ BasePooledObjectFactoryλ₯Ό μμνμ¬ κ΅¬ννλ©΄ λ©λλ€. λ€λ§, 컀λ€μ ν ꡬν μ μ€μνκ² μκ°ν΄μΌν λΆλΆμ BasePooledObjectFactoryμμ κΈ°λ³Έμ μΌλ‘ ꡬνν΄λμ΄μ ꡬνμ κ°μ νμ§ μλ ν¨μ μ€ μ»€λ₯μ νμμ κ΄λ¦¬νλ μ€λΈμ νΈκ° μμ λλ λμμ΄ λλ κ²½μ° νΈμΆλλ destoryObject ν¨μ λμμ μλ΅ν΄λ²λ¦΄ μ μλ€λ μ μ λλ€.
CPooledObjectFactory
컀λ₯μ ν κΈ°λ₯μ μ²μ ꡬννμ λΉμμ κ³ λ €νμ§ λͺ»ν λ―Έν‘ν μ μ μΈμ§νκ³ KDB νλ‘μΈμ€μ λν 컀λ₯μ μ λΌμ΄ν μ¬μ΄ν΄μ κ΄λ¦¬νλ CPooledObjectFactoryλ₯Ό λ€μ μμ±ν΄λ³΄μμ΅λλ€.
public class CPooledObjectFactory extends BasePooledObjectFactory<c> {
private final String host;
private final int port;
public CPooledObjectFactory(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public c create() throws Exception {
return new c(host, port);
}
@Override
public PooledObject<c> wrap(c c) {
return new DefaultPooledObject<>(c);
}
@Override
public boolean validateObject(PooledObject<c> p) {
try {
c c = p.getObject();
if(c.s == null || !c.s.isConnected()) {
return false;
}
c.k("1");
} catch (c.KException | IOException e) {
return false;
}
return true;
}
@Override
public void destroyObject(PooledObject<c> p) throws Exception {
close(p.getObject());
}
private void close(c c) {
if (c != null) {
try {
c.close();
} catch (IOException e) {
// ignored
}
}
}
}
λ μμΈνκ² PooledObjectFactory ꡬνμ λν΄μ κ³ λ―Όνκ³ μΆμ λΆλ€μ΄λΌλ©΄ μλμ μ€νμμ€λ€μ μ°Έκ³ ν΄λ³΄μκΈ° λ°λλλ€.
CObjectPool
μ΄μ λ 컀λ₯μ μ€λΈμ νΈλ₯Ό κ΄λ¦¬ν λ°©μμ λν΄μ μ€μ νλ κ²μ κ³ λ―Όν΄λ³΄μμΌ ν©λλ€. Apache Commons Poolμμ 컀λ₯μ μ€λΈμ νΈ λΌμ΄νμ¬μ΄ν΄μ λ°λΌ μ΄λ»κ² κ΄λ¦¬ν μ§ κ²°μ νκΈ° μν΄μλ GenericObjectPoolConfigλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
public class CObjectPoolConfig extends GenericObjectPoolConfig<c> {
public CObjectPoolConfig() {
this.setMaxTotal(8);
this.setMaxIdle(5);
this.setMinIdle(1);
this.setMaxWait(Duration.ofMinutes(3));
this.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
this.setTestWhileIdle(true);
this.setJmxEnabled(false);
}
}
컀λ₯μ ν λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ κΈ°λ³Έκ° μ€μμ JMX λͺ¨λν°λ§ κΈ°λ₯μ μ¬μ©νμ§ μμΌλ―λ‘ λΉνμ±ν ν΄λμμΌλ©° μ ν΄ μνλ‘ κ΄λ¦¬μ€μΈ 컀λ₯μ μ λν΄μλ 미리 컀λ₯μ μνλ₯Ό νμΈν μ μλλ‘ TestWhileIdle μ΅μ μ νμ±ννμμ΅λλ€. MaxWaitμ κ²½μ° μ¬μ©μ€μΈ κ° μ»€λ₯μ μ΄ μ΅λλ‘ μμν μ μλ μκ³μΉμ λ°λΌ 3λΆ κΉμ§ κΈ°λ€λ¦΄ μ μλλ‘ ν΄λμμ΅λλ€.
By default, kdb+ is single-threaded, and processes incoming queries sequentially.
컀λ₯μ λΌμ΄ν μ¬μ΄ν΄μ λ°λΌμ 컀λ₯μ νμμ 컀λ₯μ μ€λΈμ νΈκ° μμ λλ μ¬μ μλ λνμ μΌλ‘ λκ°μ§κ° μλλ°μ. νλλ μ ν΄ μνμ μλ 컀λ₯μ μ΄ λ²¨λ¦¬λ°μ΄μ 쿼리λ₯Ό μννλ κ³Όμ μμ μμΌ ν΅μ μ€λ₯κ° λ°μνκ±°λ λ무 μ€λ¬λμ 컀λ₯μ μ΄ μ¬μ©λμ§ μμμ λ²λ €μ§κ³ μλ‘μ΄ μ»€λ₯μ μ λ§λ€μ΄μ νμ μ μ§νλ μν©μ λλ€. μ 문ꡬ λ΄μ©μ²λΌ μκ³μ΄ λ°μ΄ν°λ² μ΄μ€λ λΉ λ₯΄κ² μμ²μ μ²λ¦¬νκΈ° μν΄μ μ±κΈ μ€λ λ λ°©μμ ν΅ν΄μ λ¨μΌ μμ²μ μμ°¨μ μΌλ‘ μ²λ¦¬νλκ² κΈ°λ³Έμ μΈ κΈ°μ κ΄μ μ λλ€. μ΄λ λ λμ€μμ λμμ±μ ꡬννκΈ° μν΄μ μ±νν λ°©λ²μ΄κΈ°λ νλ―λ‘ λ¨μν μ±κΈ μ€λ λμ¬μ λ¬Έμ κ° μλ€κ³ λ°λΌλ³΄λ©΄ μλ©λλ€.
exec 0 ms (481900 ns)
μκ³μ΄ λ°μ΄ν°λ² μ΄μ€κ° μ무리 λΉ λ₯΄λ€κ³ ν΄λ κΈ΄ λ²μμ μκ³μ΄ λ°μ΄ν°λ₯Ό μ‘°ννκ³ μ°μ°μ νλ€κ±°λ TCP μμΌμ ν΅ν΄ μ λ¬ν΄μΌν λ°μ΄ν°κ° μλΉν λ§μ κ²½μ°λΌλ©΄ μ±κΈ μ€λ λμ λ¨μ μΌλ‘ μΈνμ¬ μ ν μμ²μ μν΄ νν μμ²μ΄ κΈ°λ€λ¦¬λ μκ°μΌλ‘ μΈν΄ λ³λͺ© νμμ΄ λ°μν μ μλ€λ μ μ κ³ λ €ν΄μΌν©λλ€. λ§μ½, κ·Έλ¬ν μν©μ΄ μμ£Ό λ°μνλ€λ©΄ λΉ λ₯Έ μ±λ₯μ μν΄ μ±κΈ μ€λ λλ₯Ό μ±νν μκ³μ΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό νμ©νλ λ°©λ²μ΄ μλͺ»λ κ²μΌ μ μμ΅λλ€.
KDB μκ³μ΄ λ°μ΄ν°λ² μ΄μ€μ 컀λ₯μ ν λμμ λν΄μ νμΈνκ³ μΆλ€λ©΄ μλμ λ§ν¬λ€μ μ°Έκ³ νμκΈ° λ°λλλ€.