#include <SessionBuilder.h>
template <typename DataType>
class Database {
public:
Database(size_t batch_size = 5000, int retry_time = 3);
bool insert(const std::vector<DataType>& data);
protected:
std::vector<std::pair<int64_t, DataType>> m_batched_data;
size_t m_batch_size;
int m_retry_time;
virtual bool do_insert(const std::vector<std::pair<int64_t, DataType>>& data) = 0;
};
template <typename DataType>
Database<DataType>::Database(size_t batch_size, int retry_time) : m_batch_size(batch_size), m_retry_time(retry_time) {
}
template <typename DataType>
bool Database<DataType>::insert(const std::vector<DataType>& data) {
int64_t time = std::time(NULL) * 1000;
time = time - data.size() + 1;
for (const DataType& item : data) {
std::pair<int64_t, DataType> pair(time, item);
m_batched_data.push_back(pair);
time++;
}
if (m_batched_data.size() >= m_batch_size) {
bool flag = do_insert(m_batched_data);
if (!flag) {
return false;
}
m_batched_data.clear();
}
return true;
}
template <typename DataType>
class IoTDB : public Database<DataType> {
public:
IoTDB(const std::string& path, size_t batch_size = 5000, int retry_time = 3);
~IoTDB();
protected:
bool do_insert(const std::vector<std::pair<int64_t, DataType>>& data);
private:
std::string m_path;
std::string m_device_id;
std::string m_measurement;
std::shared_ptr<Session> m_session;
};
template <typename DataType>
IoTDB<DataType>::IoTDB(const std::string& path, size_t batch_size, int retry_time) : Database<DataType>(batch_size, retry_time), m_path(path) {
size_t i = path.find_last_of('.');
if (i == std::string::npos) {
throw std::invalid_argument("path does not contain '.'");
}
m_device_id = path.substr(0, i);
m_measurement = path.substr(i + 1);
std::cout << "m_device_id=" << m_device_id << ", m_measurement=" << m_measurement << std::endl;
SessionBuilder builder;
builder.enableAutoFetch(false);
builder.host("8.130.22.178");
builder.rpcPort(6667);
builder.username("root");
builder.password("root");
m_session = builder.build();
}
template <typename DataType>
IoTDB<DataType>::~IoTDB() {
m_session->close();
}
template <typename DataType>
bool IoTDB<DataType>::do_insert(const std::vector<std::pair<int64_t, DataType>>& data) {
std::vector<std::string> measurements;
measurements.push_back(m_measurement);
for (const std::pair<int64_t, DataType>& pair : data) {
const int64_t& time = std::get<0>(pair);
std::vector<std::string> measurements_data;
measurements_data.push_back(std::get<1>(pair));
m_session->insertRecord(m_device_id, time, measurements, measurements_data);
}
return true;
}

100条 32.617ms
500条 106.237ms
1000条 204.283ms
5000条 979.3ms
10000条 1946.81ms
50000条 9627.06ms