Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin AWS/Aurora:是否有可能知道是否正确使用了从机_Kotlin_Jdbi_Amazon Aurora - Fatal编程技术网

Kotlin AWS/Aurora:是否有可能知道是否正确使用了从机

Kotlin AWS/Aurora:是否有可能知道是否正确使用了从机,kotlin,jdbi,amazon-aurora,Kotlin,Jdbi,Amazon Aurora,我有一个工作的极光集群,有一个主集群和一个从集群 我使用以下代码创建一个数据源 val jdbi: Jdbi by lazy { val ds = MariaDbDataSource() ds.setUrl("jdbc:mysql:aurora://cluster_endpoint/db") ds.user = System.getenv("DB_USERNAME") ds.setPassword(System.getenv

我有一个工作的极光集群,有一个主集群和一个从集群

我使用以下代码创建一个数据源

    val jdbi: Jdbi by lazy {
        val ds = MariaDbDataSource()
        ds.setUrl("jdbc:mysql:aurora://cluster_endpoint/db")
        ds.user = System.getenv("DB_USERNAME")
        ds.setPassword(System.getenv("DB_PASSWORD"))

        val jdbi = Jdbi.create(ds)
        jdbi.installPlugin(SqlObjectPlugin())
        jdbi.installPlugin(KotlinSqlObjectPlugin())
        jdbi
    }
然后,当我处于只读操作中时,我会执行以下操作:

jdbi.open().use { handle ->
    handle.setReadOnly(true)
    ...
}
如何确保在执行此操作时,查询/连接正确路由到从属服务器

我已尝试记录数据库实例连接

val url = handle.connection.getMetaData().getURL()
val connServer = url.substring(url.indexOf("//") + 2 , url.indexOf("."));
但这总是给我集群的URL


有没有办法知道我们是在和奴隶说话还是在和主人说话?

好的,经过进一步的挖掘,我在mariadb doc中找到了答案(重点是我的)

返回包含两个相同字段的行的节点是主节点。所有其他节点都是只读副本,将标记为从属服务器

因此,在kotlin中,使用jdbi,您可以:

        //https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored
        val sql = "SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID'"
        val serverIds = handle.select(sql)
                .map { rs, _ -> Pair(rs.getString(1), rs.getString(2)) }
                .single()
        val serverId = serverIds.first
        val isMaster = serverId == serverIds.second
        val masterOrSlave = if (isMaster) "the master" else "a slave"
        Logger.getLogger(this.javaClass.name).debug("Connected to db instance $serverId which is $masterOrSlave")
        //https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored
        val sql = "SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID'"
        val serverIds = handle.select(sql)
                .map { rs, _ -> Pair(rs.getString(1), rs.getString(2)) }
                .single()
        val serverId = serverIds.first
        val isMaster = serverId == serverIds.second
        val masterOrSlave = if (isMaster) "the master" else "a slave"
        Logger.getLogger(this.javaClass.name).debug("Connected to db instance $serverId which is $masterOrSlave")