Druid adalah kumpulan koneksi database berperforma tinggi yang dirancang untuk meningkatkan performa dan efisiensi manajemen koneksi database. Topik ini menjelaskan parameter konfigurasi serta memberikan contoh cara menggunakan kumpulan koneksi Druid untuk terhubung ke kluster AnalyticDB for MySQL dalam kerangka kerja Spring.
Catatan Penggunaan
Hanya versi setelah Druid 1.1.16 yang didukung.
Saat menggunakan kumpulan koneksi Druid untuk terhubung ke kluster AnalyticDB for MySQL, disarankan untuk mengatur parameter
keepAlivemenjadi true. Hal ini memungkinkan penggunaan ulang koneksi dan mencegah koneksi singkat.Server Load Balancer (SLB) digunakan untuk menghubungkan node frontend AnalyticDB for MySQL ke klien. Untuk mendistribusikan permintaan klien secara merata ke node frontend, disarankan untuk mengonfigurasi sejumlah besar koneksi dalam kumpulan koneksi dan menetapkan nilai kecil pada parameter maxEvictableIdleTimeMillis.
Sesuaikan konfigurasi kumpulan koneksi sesuai dengan kebutuhan bisnis Anda dan pastikan konfigurasi tersebut berlaku. Anda dapat memanggil fungsi
DruidDataSource#getStatData()danDruidDataSource#dump()secara berkala untuk mendapatkan informasi konfigurasi efektif dan detail kumpulan koneksi. Informasi ini juga dapat diverifikasi melalui log.Untuk mengeksekusi query, peroleh koneksi dari kumpulan koneksi. Setelah query selesai, panggil fungsi
conn.close()sesegera mungkin untuk mengembalikan koneksi ke kumpulan koneksi. Saat mengeksekusi query berikutnya, Anda dapat memperoleh koneksi lagi dari kumpulan koneksi. Jika koneksi tidak dikembalikan dan menjadi tidak valid, Druid tidak dapat mendeteksi statusnya.Dalam skenario jaringan kompleks dengan hambatan performa gateway, tautan jaringan panjang, jitter jaringan, tingkat retranmisi tinggi, atau tingkat kehilangan paket tinggi, koneksi mungkin ditutup. Jika pemutusan tetap terjadi meskipun konfigurasi kumpulan koneksi sudah benar, gunakan kebijakan ulang untuk mengoptimalkan kode.
Konfigurasikan Kumpulan Koneksi Druid
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!--jdbc_url: titik akhir yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. Anda dapat memperoleh titik akhir di halaman Informasi Kluster konsol AnalyticDB for MySQL. -->
<property name="url" value="${jdbc_url}" />
<!--jdbc_user: akun database yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. Ini bisa berupa akun istimewa atau akun standar. -->
<property name="username" value="${jdbc_user}" />
<!--jdbc_password: kata sandi akun database yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. -->
<property name="password" value="${jdbc_password}" />
<!--Atur ukuran awal kumpulan koneksi, serta jumlah minimum dan maksimum koneksi. -->
<property name="initialSize" value="5" />
<property name="minIdle" value="10" />
<property name="maxActive" value="20" />
<!--Atur periode waktu habis untuk mendapatkan koneksi dari kumpulan koneksi. -->
<property name="maxWait" value="60000" />
<!--Atur jumlah waktu minimum dan maksimum untuk koneksi tetap idle dalam kumpulan koneksi. Unit: milidetik. Jika waktu idle koneksi melebihi jumlah waktu maksimum, koneksi akan dihapus. -->
<property name="minEvictableIdleTimeMillis" value="600000" />
<property name="maxEvictableIdleTimeMillis" value="900000" />
<!--Atur interval sistem mendeteksi koneksi idle untuk ditutup. Unit: milidetik. Nilai defaultnya adalah 60000. Nilai lebih tinggi dapat menyebabkan kumpulan koneksi Druid gagal mendeteksi pemutusan. -->
<property name="timeBetweenEvictionRunsMillis" value="2000" />
<! --Tentukan apakah akan memeriksa validitas koneksi yang waktu idlenya lebih besar dari nilai parameter timeBetweenEvictionRunsMillis setiap kali Anda mendapatkan koneksi dari kumpulan koneksi. Nilai true menentukan bahwa validitas koneksi diperiksa. Nilai false menentukan bahwa validitas koneksi tidak diperiksa. -->
<property name="testWhileIdle" value="true" />
<!--Tentukan apakah akan memeriksa validitas koneksi setiap kali Anda mendapatkan koneksi dari dan mengembalikan koneksi ke kumpulan koneksi. -->
<!--Tentukan parameter berikut hanya dalam skenario jaringan sangat penting atau tidak andal. Dalam kasus lain, kami sarankan Anda mengganti parameter dengan testWhileIdle dan timeBetweenEvictionRunsMillis. -->
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!--Tentukan apakah akan mengonfigurasi operasi keepalive reguler dan atur interval keepalive. -->
<property name="keepAlive" value="true" />
<property name="keepAliveBetweenTimeMillis" value="30000" /> <!--Nilai defaultnya adalah 120000. Unit: milidetik. -->
<!--Tentukan jumlah maksimum penggunaan koneksi. Ini mencegah beban tidak seimbang pada server yang disebabkan oleh penggunaan koneksi jangka panjang. -->
<property name="phyMaxUseCount" value="1000" />
<!--Tentukan query yang digunakan untuk menguji dan memverifikasi validitas koneksi. Di versi baru Druid, parameter ini digantikan dengan mysqlPing secara default.-->
<property name="validationQuery" value="select 1" />
<!--Tentukan filter yang digunakan untuk statistik pemantauan. -->
<property name="filters" value="stat" />
</bean> Izinkan Parameter ValidationQuery Berlaku
Di versi baru Druid, parameter validationQuery digantikan oleh mysqlPing secara default. Untuk menggunakan parameter validationQuery, konfigurasikan pengaturan berikut:
...
druidDataSource.init();
Properties properties = new Properties();
properties.setProperty("druid.mysql.usePingMethod", "false");
druidDataSource.setConnectProperties(properties);Peroleh Informasi tentang Kumpulan Koneksi
Anda dapat memanggil fungsi dataSource.dump() untuk mendapatkan informasi dasar tentang kumpulan koneksi dan koneksi.
{
CreateTime:"2022-06-01 15:28:10", # Waktu saat kumpulan koneksi dibuat.
ActiveCount:0, # Jumlah koneksi yang diperoleh dari kumpulan koneksi dan sedang digunakan.
PoolingCount:2, # Jumlah koneksi yang tersisa di kumpulan koneksi.
CreateCount:2, # Jumlah koneksi yang dibuat, termasuk koneksi yang dibuat ulang setelah dihancurkan.
DestroyCount:0, # Jumlah koneksi yang dihancurkan, termasuk koneksi yang dihancurkan karena pengecualian koneksi atau kedaluwarsa.
CloseCount:4, # Jumlah koneksi yang dikembalikan ke kumpulan koneksi dengan memanggil fungsi conn.close().
ConnectCount:4, # Jumlah kali koneksi diperoleh dengan memanggil fungsi dataSource.getConnection().
Connections:[
{
ID:525571, # ID koneksi.
ConnectTime:"2022-06-01 15:28:11", # Waktu saat koneksi dibuat.
UseCount:0, # Jumlah kali koneksi diperoleh untuk digunakan. Jumlah total nilai UseCount dari semua koneksi sama dengan nilai parameter ConnectCount.
LastActiveTime:"2022-06-01 15:28:11" # Waktu saat koneksi terakhir diperoleh untuk digunakan. Jika koneksi ini tidak pernah digunakan, nilai parameter LastActiveTime sama dengan nilai parameter ConnectTime.
},
{ID:1263877414, ConnectTime:"2022-06-01 15:28:11", UseCount:4, LastActiveTime:"2022-06-01 15:28:11"}
]
}Peroleh Konfigurasi Kumpulan Koneksi yang Berlaku
Anda dapat memanggil fungsi dataSource.getStatData() untuk memperoleh konfigurasi kumpulan koneksi yang berlaku.
{
Identity=85777802,
Name=DataSource-85777802,
DbType=mysql,
DriverClassName=com.mysql.jdbc.Driver,
URL=jdbc:mysql://host:port/db_name,
UserName=haicen,
FilterClassNames=[],
WaitThreadCount=0,
NotEmptyWaitCount=0,
NotEmptyWaitMillis=0,
PoolingCount=2,
PoolingPeak=2,
PoolingPeakTime=Rab Jun 01 16:08:15 CST 2022,
ActiveCount=0,
ActivePeak=1,
ActivePeakTime=Rab Jun 01 16:08:15 CST 2022,
InitialSize=1,
MinIdle=2,
MaxActive=3,
QueryTimeout=0,
TransactionQueryTimeout=0,
LoginTimeout=0,
ValidConnectionCheckerClassName=com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker,
ExceptionSorterClassName=com.alibaba.druid.pool.vendor.MySqlExceptionSorter,
TestOnBorrow=true,
TestOnReturn=true,
TestWhileIdle=true,
DefaultAutoCommit=true,
DefaultReadOnly=null,
DefaultTransactionIsolation=null,
LogicConnectCount=14,
LogicCloseCount=14,
LogicConnectErrorCount=0,
PhysicalConnectCount=6,
PhysicalCloseCount=4,
PhysicalConnectErrorCount=0,
DiscardCount=0,
ExecuteCount=14,
ExecuteUpdateCount=0,
ExecuteQueryCount=14,
ExecuteBatchCount=0,
ErrorCount=0,
CommitCount=0,
RollbackCount=0,
PSCacheAccessCount=0,
PSCacheHitCount=0,
PSCacheMissCount=0,
StartTransactionCount=0,
TransactionHistogram=[
J@6a472554,
ConnectionHoldTimeHistogram=[
J@7ff2a664,
RemoveAbandoned=true,
ClobOpenCount=0,
BlobOpenCount=0,
KeepAliveCheckCount=332,
KeepAlive=true,
FailFast=false,
MaxWait=6000,
MaxWaitThreadCount=-1,
PoolPreparedStatements=false,
MaxPoolPreparedStatementPerConnectionSize=10,
MinEvictableIdleTimeMillis=600000,
MaxEvictableIdleTimeMillis=900000,
LogDifferentThread=true,
RecycleErrorCount=0,
PreparedStatementOpenCount=0,
PreparedStatementClosedCount=0,
UseUnfairLock=false,
InitGlobalVariants=false,
InitVariants=false
}