LindormTSDB bağlantılarını verimli bir şekilde yönetmek için JDBC bağlantı havuzu olarak Alibaba Druid kullanın. Bağlantı havuzu, her yazma veya sorgu işlemi için bağlantı açıp kapatmak yerine önceden bir dizi bağlantı oluşturur ve bu bağlantıları veritabanı işlemlerinde yeniden kullanır. connection.close() çağrısı bağlantıyı sonlandırmak yerine havuza geri döndürür.
Bu yaklaşım, özellikle uygulamaların kısa ömürlü işlemlerle yüksek frekansta sensör okumaları yazdığı IoT ve zaman serisi iş yükleri için faydalıdır. Bağlantıların yeniden kullanılması gecikme süresini ve kaynak tüketimini önemli ölçüde azaltır.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Java Development Kit (JDK) 1,8 veya sonraki bir sürümün yüklü olması
İstemci IP adresinizin Lindorm örneğinizin izin listesine eklenmiş olması. Bkz. İzin listesi yapılandırma
Maven bağımlılıklarını ekleme
Hem Druid bağlantı havuzunu hem de Lindorm JDBC sürücüsünü pom.xml dosyanıza ekleyin:
<!-- Alibaba Druid connection pool -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<!-- Lindorm JDBC driver -->
<dependency>
<groupId>com.aliyun.lindorm</groupId>
<artifactId>lindorm-all-client</artifactId>
<version>2.2.1.3</version>
</dependency>
JDBC sürücüsünü manuel olarak yüklemek isterseniz lindorm-all-client JAR paketini indirin ve proje classpath'inize ekleyin. Örneğin, 2.1.5 sürümünü kullanmak için lindorm-all-client-2.1.5.jar dosyasını indirin.
Druid'i yapılandırma
Maven projenizin src/main/resources dizininde druid.properties adlı bir dosya oluşturun.
Gerekli parametreler
Bu parametreler Druid'i LindormTSDB örneğinize bağlar. Yer tutucu değerleri Lindorm konsolundaki gerçek bağlantı ayrıntılarınızla değiştirin.
# Driver class — keep this value unchanged
driverClassName=com.aliyun.lindorm.table.client.Driver
# JDBC URL — get this from the Lindorm console
url=jdbc:lindorm:tsdb:url=http://ld-bp12pt80qr38p****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242
username=root
password=root
# Database to connect to
connectionProperties=database=default
JDBC URL biçimi ve parametreleri hakkında ayrıntılı bilgi için bkz. JDBC sürücüsünün URL'si . Varsayılan kullanıcı adı ve parola root değeridir.
Havuz boyutu ve zaman aşımı
# Initialize the pool on startup
init=true
# Number of connections to create at startup
initialSize=10
# Minimum number of idle connections to maintain
minIdle=10
# Maximum number of active connections
maxActive=20
# Maximum time to wait for a connection, in milliseconds
maxWait=30000
İş yükünüze göre initialSize, minIdle ve maxActive değerlerini ayarlayın. maxWait değerini 30000 ms olarak bırakın.
Keep-alive ayarları
Bu ayarlar sunucunun boşta kalan bağlantıları sessizce kesmesini önler. ConnectionDisconnectedException hatalarından kaçınmak için tüm değerleri değiştirmeden bırakın.
druid.keepAlive=true
druid.keepAliveBetweenTimeMillis=30000
minEvictableIdleTimeMillis=600000
maxEvictableIdleTimeMillis=900000
timeBetweenEvictionRunsMillis=5000
Bağlantı doğrulama
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
Statement önbelleği
Hazırlanmış ifade (prepared statement) önbelleğini devre dışı bırakın. Bu özelliği etkinleştirmek LindormTSDB ile NoSuchStatement özel durumlarına neden olur.
poolPreparedStatements=false
maxOpenPreparedStatements=-1
druid.maxPoolPreparedStatementPerConnectionSize=-1
Bağlanma ve sorgu çalıştırma
Bağlantı havuzunu başlatma
druid.properties dosyasını yükleyin ve DataSource nesnesini oluşturun:
// Load Druid configuration
Properties properties = new Properties();
InputStream inputStream = tsdb.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
// Initialize the connection pool
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Tablo oluşturma
try (Connection connection = dataSource.getConnection()) {
try (Statement statement = connection.createStatement()) {
String sql = "CREATE TABLE sensor ("
+ "device_id VARCHAR TAG,"
+ "region VARCHAR TAG,"
+ "time TIMESTAMP,"
+ "temperature DOUBLE,"
+ "humidity DOUBLE,"
+ "PRIMARY KEY(device_id))";
int ret = statement.executeUpdate(sql);
System.out.println(ret);
}
} // connection.close() returns the connection to the pool
Veri ekleme
Birden çok satırı tek bir gidiş-dönüşte göndermek için addBatch yöntemini kullanın:
try (Connection connection = dataSource.getConnection()) {
try (Statement stmt = connection.createStatement()) {
stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45)");
stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:10',13.2,47)");
stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn','2021-04-22 15:33:20',10.6,46)");
stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:00',18.1,44)");
stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn','2021-04-22 15:33:10',19.7,44)");
stmt.executeBatch();
}
} // connection.close() returns the connection to the pool
Veri sorgulama
Taranan veri miktarını sınırlamak için her zaman bir zaman aralığı belirtin:
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement pstmt = connection.prepareStatement(
"SELECT device_id, region, time, temperature, humidity FROM sensor WHERE time >= ? AND time <= ?")) {
Timestamp startTime = Timestamp.valueOf("2021-04-22 15:33:00");
Timestamp endTime = Timestamp.valueOf("2021-04-22 15:33:20");
pstmt.setTimestamp(1, startTime);
pstmt.setTimestamp(2, endTime);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
String device_id = rs.getString("device_id");
String region = rs.getString("region");
Timestamp time = rs.getTimestamp("time");
Double temperature = rs.getDouble("temperature");
Double humidity = rs.getDouble("humidity");
System.out.printf("%s %s %s %f %f\n", device_id, region, time, temperature, humidity);
}
}
}
} // connection.close() returns the connection to the pool