选择驱动或 ORM 框架

TiDB 兼容 MySQL 的协议,但存在部分与 MySQL 不兼容的特性,例如:

TiDB 不支持:

  • 存储过程与函数
  • 触发器
  • 外键约束

TiDB 与 MySQL 有差异:

  • 自增 ID:可保证全局唯一,或单 TiDB 节点的自增,但无法保证全局自增。

全部兼容性差异可查看与 MySQL 兼容性对比

Java

支持等级说明

  • Full: 此 Driver 或 ORM 没有已知的 issues
  • Verified: 你可能会因为 TiDB 兼容性问题,导致出现错误

Java Drivers

JDBC

支持等级:Full

按照 MySQL 文档中的说明下载并配置 Java JDBC 驱动程序即可使用。

注意:

强烈建议使用 JDBC 5.1 的最后一个版本 5.1.49。因为当前 8.0.29 版本有未合并的 Bug 修复,在与 TiDB 共同使用时可能会导致线程卡死。在 MySQL JDBC 8.0 未合并此修复之前,建议不要升级至 8.0 版本。

有关一个完整的实例应用程序,可参阅使用 TiDB 和 JDBC 构建一个 Java 应用

Java ORM Framework

Hibernate

支持等级:Full

注意

Hibernate 当前不支持嵌套事务,TiDB 当前版本也不支持 Savepoint。 若你使用 Spring Data JPA 等框架,在 @Transactional 中请勿使用 Propagation.NESTED 事务传播选项,即:@Transactional(propagation = Propagation.NESTED)

你可以使用这个例子,快速复现 TiDB 与 MySQL 对 Savepoint 的输出结果:

MySQL:
id: 1, coins: 1, goods: 1
id: 3, coins: 1, goods: 1

TiDB:

2022/04/02 13:59:48 /<path>/go/pkg/mod/gorm.io/driver/mysql@v1.3.2/mysql.go:397 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 9 near "SAVEPOINT sp0x102cf8960"
[1.119ms] [rows:0] SAVEPOINT sp0x102cf8960

2022/04/02 13:59:48 /<path>/go/pkg/mod/gorm.io/driver/mysql@v1.3.2/mysql.go:397 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 9 near "SAVEPOINT sp0x102cf8960"
[0.001ms] [rows:0] SAVEPOINT sp0x102cf8a00
id: 1, coins: 1, goods: 1

你可以使用 GradleMaven 获取你的应用程序的所有依赖项,且会帮你下载依赖项的间接依赖,而无需你手动管理复杂的依赖关系。注意,只有 Hibernate 6.0.0.Beta2 及以上版本才支持 TiDB 方言。

如果你使用的是 Maven,请将以下内容添加到你的 <dependencies></dependencies>

<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>6.0.0.CR2</version>
</dependency>

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

如果你使用的是 Gradle,请将以下内容添加到你的 dependencies

implementation 'org.hibernate:hibernate-core:6.0.0.CR2'
implementation 'mysql:mysql-connector-java:5.1.49'

额外的,你需要在 Hibernate 配置文件中指定 TiDB 方言: org.hibernate.dialect.TiDBDialect,此方言在 Hibernate 6.0.0.Beta2 以上才可支持。若你无法升级 Hibernate 版本,那么请你直接使用 MySQL 5.7 的方言 org.hibernate.dialect.MySQL57Dialect。但这可能造成不可预料的使用结果,及部分 TiDB 特有特性的缺失,如:序列等。

文档内容是否有帮助?