暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-X JDBC 驱动(polardbx-connector-java) ~ 使用篇

原创 polardb云校长 2024-12-30
915

Maven依赖

驱动为 polardbx-connector-java,同时通过 provided 方式依赖 mysql-connector-java,便于用户自行选择使用的 MySQL JDBC connector。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

<dependency>
    <groupId>com.alibaba.polardbx</groupId>
    <artifactId>polardbx-connector-java</artifactId>
    <version>2.1.2</version>
</dependency>


快速使用例子

1. 直接使用驱动连接 PolarDB-X

Class.forName("com.alibaba.polardbx.Driver");

try (final Connection conn = DriverManager.getConnection(
    "jdbc:polardbx://127.0.0.1:3306/", "root", "*****");
    final Statement stmt = conn.createStatement()) {

    try (final ResultSet rs = stmt.executeQuery("select 1")) {
        for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
            System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");
        }
        System.out.println();
        while (rs.next()) {
            for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                System.out.print(rs.getObject(i + 1) + "\t");
            }
            System.out.println();
        }
    }
}

2. 使用 Druid 连接池

try (final DruidDataSource dataSource = new DruidDataSource()) {
    dataSource.setUrl("jdbc:polardbx://127.0.0.1:3306/");
    dataSource.setUsername("root");
    dataSource.setPassword("*****");
    
    // 当 druid 连接池版本小于等于 1.2.23 时,需要主动调用 setDriverClassName 和 setExceptionSorter,以适配 PolarDB-X 的驱动,新版本 1.2.24 及后续版本能够自动识别驱动
    dataSource.setDriverClassName("com.alibaba.polardbx.Driver");
    dataSource.setExceptionSorter(new MySqlExceptionSorter());

    try (final Connection conn = dataSource.getConnection();
        final Statement stmt = conn.createStatement()) {

        try (final ResultSet rs = stmt.executeQuery("select 1")) {
            for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");
            }
            System.out.println();
            while (rs.next()) {
                for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                    System.out.print(rs.getObject(i + 1) + "\t");
                }
                System.out.println();
            }
        }
    }
}

或者通过 xml 设置数据源后,通过代码,新增这两项适配新驱动:

dataSource.setDriverClassName("com.alibaba.polardbx.Driver");
dataSource.setExceptionSorter(new MySqlExceptionSorter());

3. 使用 HikariCP 连接池

Class.forName("com.alibaba.polardbx.Driver");

final HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:polardbx://127.0.0.1:3306/");
config.setUsername("root");
config.setPassword("*****");
config.setMaximumPoolSize(10);

try (HikariDataSource dataSource = new HikariDataSource(config)) {
    try (final Connection conn = dataSource.getConnection();
        final Statement stmt = conn.createStatement()) {

        try (final ResultSet rs = stmt.executeQuery("select 1")) {
            for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");
            }
            System.out.println();
            while (rs.next()) {
                for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                    System.out.print(rs.getObject(i + 1) + "\t");
                }
                System.out.println();
            }
        }
    }
}

4. 使用 DBCP 连接池

Class.forName("com.alibaba.polardbx.Driver");

final BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:polardbx://127.0.0.1:3306/");
dataSource.setUsername("root");
dataSource.setPassword("*****");
dataSource.setInitialSize(5);

try (final Connection conn = dataSource.getConnection();
    final Statement stmt = conn.createStatement()) {

    try (final ResultSet rs = stmt.executeQuery("select 1")) {
        for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
            System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");
        }
        System.out.println();
        while (rs.next()) {
            for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                System.out.print(rs.getObject(i + 1) + "\t");
            }
            System.out.println();
        }
    }
}

实际Demo

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestDriver {
    public static void main(String[] args) throws Exception {
        Class.forName("com.alibaba.polardbx.Driver");

        try (final Connection conn = DriverManager.getConnection(
            "jdbc:polardbx://127.0.0.1:3306/", "root", "****");
            final Statement stmt = conn.createStatement()) {

            try (final ResultSet rs = stmt.executeQuery("select * from information_schema.alisql_cluster_global")) {
                for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                    System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");
                }
                System.out.println();
                while (rs.next()) {
                    for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {
                        System.out.print(rs.getObject(i + 1) + "\t");
                    }
                    System.out.println();
                }
            }
        }
    }
}

编译运行

$javac TestDriver.java

$ll
total 2812
-rw-r--r-- 1 chenyu.zzy users 2481560 Dec  3 17:26 mysql-connector-j-8.0.33.jar
-rw-r--r-- 1 chenyu.zzy users  384133 Dec  3 17:19 polardbx-connector-java-2.1.2.jar
-rw-r--r-- 1 chenyu.zzy users    2442 Dec  3 17:29 TestDriver.class
-rw-r--r-- 1 chenyu.zzy users    1102 Dec  3 17:29 TestDriver.java

# 第一次运行时,高可用会打印获取到的集群信息到日志接口中
$java -cp .:mysql-connector-j-8.0.33.jar:polardbx-connector-java-2.1.2.jar TestDriver
Dec 03, 2024 5:29:58 PM com.alibaba.polardbx.HaManager info
INFO: Backend cluster state changed to: [{"tag":"127.0.0.1:6991","host":"127.0.0.1","port":6991,"xport":34991,"paxos_port":14991,"role":"Leader","peers":[{"tag":"11.167.60.147:6992","host":"11.167.60.147","port":6992,"xport":-1,"paxos_port":14992,"role":"Follower","version":"8.0.32-X-Cluster-8.4.20-20241014","cluster_id":6990,"update_time":"2024-12-03 17:29:58 GMT+08:00"},{"tag":"11.167.60.147:6993","host":"11.167.60.147","port":6993,"xport":-1,"paxos_port":14993,"role":"Follower","version":"8.0.32-X-Cluster-8.4.20-20241014","cluster_id":6990,"update_time":"2024-12-03 17:29:58 GMT+08:00"},{"tag":"127.0.0.1:6991","host":"11.167.60.147","port":6991,"xport":34991,"paxos_port":14991,"role":"Leader","version":"8.0.32-X-Cluster-8.4.20-20241014","cluster_id":6990,"update_time":"2024-12-03 17:29:58 GMT+08:00"}],"version":"8.0.32-X-Cluster-8.4.20-20241014","cluster_id":6990,"update_time":"2024-12-03 17:29:58 GMT+08:00"}]
SERVER_ID	IP_PORT	MATCH_INDEX	NEXT_INDEX	ROLE	HAS_VOTED	FORCE_SYNC	ELECTION_WEIGHT	LEARNER_SOURCE	APPLIED_INDEX	PIPELINING	SEND_APPLIED
1	11.167.60.147:14991	264333	0	Leader	Yes	No	9	0	264332	No	No
2	11.167.60.147:14992	264333	264334	Follower	Yes	No	9	0	264333	Yes	No
3	11.167.60.147:14993	264333	264334	Follower	Yes	No	1	0	264333	Yes	No

# 再次运行由于集群信息没有变化,则不会打印相关信息(集群信息会被缓存以加快初始化速度)
$java -cp .:mysql-connector-j-8.0.33.jar:polardbx-connector-java-2.1.2.jar TestDriver
SERVER_ID	IP_PORT	MATCH_INDEX	NEXT_INDEX	ROLE	HAS_VOTED	FORCE_SYNC	ELECTION_WEIGHT	LEARNER_SOURCE	APPLIED_INDEX	PIPELINING	SEND_APPLIED
1	11.167.60.147:14991	264333	0	Leader	Yes	No	9	0	264332	No	No
2	11.167.60.147:14992	264333	264334	Follower	Yes	No	9	0	264333	Yes	No
3	11.167.60.147:14993	264333	264334	Follower	Yes	No	1	0	264333	Yes	No


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论