Tüm Ürünler
Search
Belge Merkezi

Lindorm:Öğretici: LindormTSDB'ye bağlanmak için Druid bağlantı havuzunu kullanma

Son Güncelleme:Oct 07, 2026

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

Tam örnek kod

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class tsdb {
    public static void main(String[] args) throws Exception {
        // 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);

        // Create a table
        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

        // Insert data using batch for efficiency
        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

        // Query data — specify a time range to limit data scanned
        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
    }
}

Beklenen çıktı:

0
F07A1260 north-cn 2021-04-22 15:33:00.0 12.100000 45.000000
F07A1260 north-cn 2021-04-22 15:33:10.0 13.200000 47.000000
F07A1260 north-cn 2021-04-22 15:33:20.0 10.600000 46.000000
F07A1261 south-cn 2021-04-22 15:33:00.0 18.100000 44.000000
F07A1261 south-cn 2021-04-22 15:33:10.0 19.700000 44.000000