# JDBC 配置建议

__*JDBC 配置建议*__

+ `useSSL=true|false`: Connectors 8.0.12 以及更早
+ `sslMode=<mode_name>`: Connectors 8.0.13 或以上

```12
JDBC:mysql://{TiDBIP}:{TiDBPort}/{DBName}?\
characterEncoding=utf8&\
~!@cachePrepStmts=true@!~&\
~!@useServerPrepStmts=true@!~&\
~!@prepStmtCacheSqlLimit=10000000000@!~&\
~!@useConfigs=maxPerformance@!~&\
~!@rewriteBatchedStatements=true@!~&\
~!@defaultfetchsize=-214783648@!~
```

----------------------------------------------------
1. `characterEncoding`:
    Java 中的字符使用 Unicode 编码,每个字符占用两个字节,16 个二进制位,向 ByteBuffer 中存放数据的时候需要考虑字符的编码,从中读取的时候也需要考虑字符的编码方式,也就是编码和解码。

2. `useServerPrepStmts`:
    可以防止sql注入,于性能考虑,应该在数据库连接池上开启针对PreparedStatement的缓存。如果没有使用连接池,或者所用的连接池不支持PSCache,也可以在JDBC连接上设置cachePrepStmts=true。

3. `useConfig:useConfigs=maxPerformance`: 
    这个设置等于:
```
cachePrepStmts=true
cacheCallableStmts=true
cacheServerConfiguration=true
useLocalSessionState=true
elideSetAutoCommits=true
alwaysSendSetIsolation=false
enableQueryTimeouts=false
```

4. `rewriteBatchedStatements`:
    MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。

5. `defaultfetchsize`:
    fetchsize的设置,跟具体业务系统有关系,没有一个最好的值可以供各个应用都可以使用。一般OLTP的系统,fetchsize使用jdbc的默认值就可以了。我查看了下网络上的大部分文章,在某个特定的条件下测试的fetchsize,得出一个值,然后所有人都用这个值来设置自己的应用系统。一般情况下,这仅仅只是一些资源的浪费,但是,在某些情况下,如数据源拆分,读写分离架构中,当fetchsize设置的太大,有可能会导致性能的急剧下降,甚至会导致应用上可怕的JVM内存溢出,在不少公司发生过这种惨痛的教训。建议在设置这个值之前,先做一个JVM内存的DUMP,以便能够对内存的占用情况有一个清晰的了解。