应用连接池选择
连接资源是数据库中非常宝贵及有限的资源,应用并发量很大时,如果没有连接池,会占用大量的数据库的连接,导致后端数据库连接不足,无法正常提供服务,我们建议应用使用连接池来完成连接工作。在java中,推荐HikariCP作为应用连接池。
JDBC约束
- 不支持 rewriteBatchedStatements=true 参数设置(默认为 false)。
- BLOB, BINARY, VARBINARY 字段不能使用 setBlob() 或 setBinaryStream() 方法设置参数 。
操作步骤
- 在控制台创建表并配置分片规则,参考建表DDL如下。
create table if not exists enumtable(
id int not null,
code int not null,
content varchar(250) not null,
primary key(id)
)engine=innodb charset=utf8;
- 配置依赖。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
- 配置JDBC连接池参数。
<bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 无需指定,除非系统无法自动识别 -->
<property name="jdbcUrl" value="jdbc:mysql://ip:port/db?useSSL=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&rewriteBatchedStatements=false" />
<property name="username" value="DRDS用户名" />
<property name="password" value="DRDS密码" />
<!-- 连接只读数据库时配置为true, 保证安全 -->
<property name="readOnly" value="false" />
<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
<property name="connectionTimeout" value="30000" />
<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
<property name="idleTimeout" value="600000" />
<!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
<property name="maxLifetime" value="1800000" />
<!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
<property name="maximumPoolSize" value="15" />
</bean>
- 连接DRDS实例执行相关sql。
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) throws SQLException {
ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");
HikariDataSource dataSource = (HikariDataSource) app.getBean("dataSourceHikari");
Connection conn = null;
try {
conn = dataSource.getConnection();
//开启事务
conn.setAutoCommit(false);
// 插入测试数据
PreparedStatement ps1 = conn.prepareStatement("insert into enumtable (id,code,content) values (?,?,?);");
ps1.setInt(1, 1);
ps1.setInt(2, 1001);
ps1.setString(3, "测试数据");
ps1.executeUpdate();
conn.commit ();
//查询条件带上分片键或切片索引键,否则语句将广播执行
PreparedStatement ps2 =
conn.prepareStatement("SELECT * FROM enumtable WHERE id = ?");
ps2.setInt(1, 1);
ResultSet rs = ps2.executeQuery();
rs.next();
String space = "";
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
System.out.print(space + rs.getMetaData().getColumnName(i) +
" = " + rs.getString(i));
space = ", ";
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
}
}
}