通過JDBC連接池連接DRDS
更新時間 2023-12-27 11:51:52
最近更新時間: 2023-12-27 11:51:52
分享文章
本章節主要介紹了如何通過JDBC連接池與DRDS對接,實現數據操作。
應用連接池選擇
連接資源是數據庫中非常寶貴及有限的資源,應用并發量很大時,如果沒有連接池,會占用大量的數據庫的連接,導致后端數據庫連接不足,無法正常提供服務,我們建議應用使用連接池來完成連接工作。在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();
}
}
}
}