programing

Java의 mariadb 커넥터가 다른 언어의 커넥터보다 mariadb에 더 빨리 연결되는 이유는 무엇입니까?

telebox 2023. 7. 31. 21:19
반응형

Java의 mariadb 커넥터가 다른 언어의 커넥터보다 mariadb에 더 빨리 연결되는 이유는 무엇입니까?

녹을 배우고 있는데, 최근에는 Sqlx 라이브러리를 사용하여 데이터베이스에 연결하려고 합니다.풀을 사용하든 사용하지 않든 연결 속도는 항상 2초 이상이지만, Java Connector(mariadb.com 에서 제공하는 mariadb에 연결할 때는 1초 미만이 걸리고 왜 이런 일이 일어나는지 잘 이해할 수 없습니다.C#의 MysqlConnector를 사용한 적이 있으며, mariadb에 연결하는 데 최소 2초가 소요됩니다.결국 자바 커넥터보다 느린 C 커넥터, C++ 커넥터, ODBC 커넥터도 시도해 보았습니다.

kotlin 샘플 코드(mariadb-sys-client 패키지 사용):

fun main() {
    var timeStart = LocalTime.now().toNanoOfDay()
    Class.forName(dbClsName)
    var timeUsed = LocalTime.now().toNanoOfDay() - timeStart
    println("load class took time = $timeUsed ns")
    val p = Properties()
    p["user"] = userName
    p["password"] = password

    timeStart = LocalTime.now().toNanoOfDay()
    val conn = DriverManager.getConnection(connStr, p)
    timeUsed = LocalTime.now().toNanoOfDay() - timeStart
    val secs = timeUsed.toDouble() / 1e9
    println("connect successed! took time = $timeUsed ns, almost $secs s")

    timeStart = LocalTime.now().toNanoOfDay()
    val stmt = conn.createStatement()
    val rst = stmt.executeQuery("SHOW DATABASES;")
    timeUsed = LocalTime.now().toNanoOfDay() - timeStart
    println("query took time = $timeUsed ns")
    var i = 0
    while (rst.next()){
        i++
        println("result${i}:\n\t${rst.getString(1)}")
    }
    conn.close()
}

코틀린 코드 결과:

load class took time = 15631300 ns
connect successed! took time = 101765000 ns, almost 0.101765 s
query took time = 0 ns
...

러스트 샘플 코드(sqlx 사용):

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    let mut time_start = chrono::Local::now();
    let mut db_conn = MySqlConnection::connect(CONN_STR).await?;
    let duration_conn = chrono::Local::now() - time_start;
    println!(
        "connect db took time = {}ns, almost {}s",
        duration_conn.num_nanoseconds().unwrap_or_default(),
        duration_conn.num_seconds()
    );

    time_start = chrono::Local::now();
    let results = sqlx::query("SHOW DATABASES")
        .map(|row: MySqlRow| row.get::<String, usize>(0))
        .fetch_all(&mut db_conn)
        .await?;
    let query_duration = chrono::Local::now() - time_start;
    println!(
        "query db took time = {}ns, almost {}s",
        query_duration.num_nanoseconds().unwrap_or_default(),
        query_duration.num_seconds()
    );

    for row_str in results {
        println!("{}", row_str)
    }
    Ok(())
}

녹 샘플 결과:

connect db took time = 2045829800ns, almost 2s
query db took time = 1324300ns, almost 0s
...

C# 샘플 코드(MysqlConnector 사용):

public static void Main() {
    var time_start = DateTime.UtcNow;
    using var conn = new MySqlConnection(connStr);
    var time_takes = DateTime.UtcNow - time_start;
    Console.WriteLine($"consturct connection finished; took time = {time_takes.Ticks}ticks, 
        almost {(long)time_takes.TotalSeconds}s");
    time_start = DateTime.UtcNow;
    conn.Open();
    time_takes = DateTime.UtcNow - time_start;
    Console.WriteLine($"open mysql connection finished; take time = {time_takes.Ticks}ticks, 
        almost {(long)time_takes.TotalSeconds}s");

    using var query_command = new MySqlCommand("SHOW DATABASES;", conn);
    using var reader_dbs = query_command.ExecuteReader();
    while (reader_dbs.Read())
    {
        Console.WriteLine(reader_dbs.GetString(0));
    }
}

C# 샘플 결과:

consturct connection finished; took time = 1597ticks, almost 0s
open mysql connection finished; take time = 22826302ticks, almost 2s
...

또한 Java 커넥터와 다른 커넥터의 연결 시간 차이는 육안으로 볼 수 있으므로 벤치마크 라이브러리로 경과 시간을 측정하지 않았다는 점은 무시해 주십시오.

언급URL : https://stackoverflow.com/questions/71263677/why-javas-mariadb-connector-connects-to-mariadb-faster-than-connectors-in-other

반응형