SDK と連携
SDK と連携
さまざまな言語とプロトコルから Machbase に接続するための SDK、API、連携方法を説明します。
SDK と API
ODBC/CLI (C/C++)
高い性能を得るためのネイティブ C/C++ API:
- DB への直接アクセス
- 一括入力用 APPEND プロトコル
- 低遅延
- 全機能のサポート
用途:C/C++ 開発、最大限の性能が必要な場合
JDBC (Java)
Java 用の標準 JDBC ドライバー:
- 標準 JDBC インターフェース
- コネクションプール
- Spring/Hibernate との互換性
- AUTH KEY チャレンジ認証(Machbase 8.5 以降)
- APPEND API
用途:Java 開発、標準 JDBC が必要な場合
Python
Python クライアントライブラリー:
- Python に適した API
- Pandas 連携
- 簡単な接続管理
- データのインポートとエクスポート
用途:データサイエンス、スクリプト、Python アプリケーション
.NET (C#)
C# 用の .NET プロバイダー:
- ADO.NET 互換
- コネクションプール
- LINQ サポート
- Entity Framework 互換
用途:.NET/C# 開発
REST API
Web アプリケーション用の HTTP API:
- 言語に依存しない
- JSON 応答
- 簡単な連携
- Web に適した構成
用途:Web、マイクロサービス、HTTP のみ使用可能な環境
この DBMS セクションに REST API リファレンスは含まれません。
クイックスタートの例
C/C++ (ODBC/CLI)
#include <machbase_sqlcli.h>
SQLHENV env;
SQLHDBC conn;
SQLHSTMT stmt;
// 接続
SQLAllocEnv(&env);
SQLAllocConnect(env, &conn);
SQLConnect(conn, "127.0.0.1", SQL_NTS, "SYS", SQL_NTS, "MANAGER", SQL_NTS);
// 検索
SQLAllocStmt(conn, &stmt);
SQLExecDirect(stmt, "SELECT * FROM sensors DURATION 1 HOUR", SQL_NTS);
// 後処理
SQLFreeStmt(stmt, SQL_DROP);
SQLDisconnect(conn);Java (JDBC)
Class.forName("com.machbase.jdbc.MachDriver");
Connection conn = DriverManager.getConnection(
"jdbc:machbase://127.0.0.1:5656/MACHBASE",
"SYS", "MANAGER"
);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM sensors DURATION 1 HOUR");
while (rs.next()) {
System.out.println(rs.getString("sensor_id"));
}Python
from machbaseAPI import connect
conn = connect(host='127.0.0.1', port=5656, user='SYS', password='MANAGER')
cur = conn.cursor()
cur.execute("SELECT * FROM sensors DURATION 1 HOUR")
for row in cur.fetchall():
print(row)
conn.close()C# (.NET)
using Mach.Data.MachClient;
string connString = "SERVER=127.0.0.1;PORT_NO=5656;UID=SYS;PWD=MANAGER;PROTOCOL=4.0-full";
MachConnection conn = new MachConnection(connString);
conn.Open();
MachCommand cmd = new MachCommand("SELECT * FROM sensors DURATION 1 HOUR", conn);
MachDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
Console.WriteLine(reader.GetString(0));
}REST API (JavaScript)
const params = new URLSearchParams({
q: 'SELECT * FROM sensors DURATION 1 HOUR'
});
const response = await fetch(`http://localhost:5657/machbase?${params}`);
const data = await response.json();
console.log(data);連携パターン
パターン 1:リアルタイムのデータ収集
# センサーデータの収集
from machbaseAPI import connect
import time
conn = connect(host='127.0.0.1', port=5656, user='SYS', password='MANAGER')
while True:
rows = []
for i in range(1000):
sensor_id = f'sensor{i % 100:03d}'
value = read_sensor(sensor_id)
rows.append([sensor_id, time.time(), value])
conn.append('sensors', rows)
time.sleep(10)パターン 2:ダッシュボード
// リアルタイムダッシュボードのバックエンド
@RestController
public class DashboardController {
@Autowired
private DataSource dataSource;
@GetMapping("/api/sensors/current")
public List<SensorData> getCurrentData() {
String sql = "SELECT * FROM sensors DURATION 5 MINUTE";
return jdbcTemplate.query(sql, new SensorDataMapper());
}
}パターン 3:バッチ処理
// 夜間バッチジョブ
public class BatchProcessor {
public void ProcessDailyData() {
using (var conn = new MachConnection(connString)) {
conn.Open();
var sql = @"
SELECT sensor_id, AVG(value), MAX(value), MIN(value)
FROM sensors
WHERE _arrival_time >= SYSDATE - 1
GROUP BY sensor_id
";
var cmd = new MachCommand(sql, conn);
var reader = cmd.ExecuteReader();
while (reader.Read()) {
ProcessSensorStats(reader);
}
}
}
}接続管理
コネクションプール(Java)
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:machbase://127.0.0.1:5656/MACHBASE");
config.setUsername("SYS");
config.setPassword("MANAGER");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
HikariDataSource pool = new HikariDataSource(config);接続の再試行(Python)
import time
from machbaseAPI import connect
def connect_with_retry(max_retries=3):
for i in range(max_retries):
try:
return connect(host='127.0.0.1', port=5656, user='SYS', password='MANAGER')
except Exception as e:
if i == max_retries - 1:
raise
time.sleep(1)性能向上のヒント
- 一括入力には APPEND API を使用
- コネクションプールを有効化
- 操作をまとめる(1000 ~ 10000 行)
- プリペアードステートメントを再利用
- リソースを正しく解放
フレームワーク連携
Spring Boot (Java)
# application.yml
spring:
datasource:
url: jdbc:machbase://127.0.0.1:5656/MACHBASE
username: SYS
password: MANAGER
driver-class-name: com.machbase.jdbc.MachDriver汎用 DB-API(Python)
from machbaseAPI import connect
conn = connect(host='127.0.0.1', port=5656, user='SYS', password='MANAGER')
cur = conn.cursor()
cur.execute("SELECT * FROM sensors DURATION 1 HOUR")
rows = cur.fetchall()
conn.close()セキュリティの推奨事項
- 認証情報には環境変数を使用
- 接続に SSL/TLS を有効化
- レポートには読み取り専用ユーザーを使用
- 接続タイムアウトを設定
- 入力値を検証し、無害化
トラブルシューティング
接続の失敗
# 状態を確認
import socket
try:
sock = socket.socket()
sock.connect(('127.0.0.1', 5656))
print("Server is reachable")
except:
print("Cannot connect to server")性能の問題
- 一括入力には APPEND API を使用
- コネクションプールを有効化
- 操作をバッチ化
- ネットワーク遅延を確認
メモリの問題
- 結果セットのサイズを制限
- サーバー側カーソルを使用
- データを分割して処理
- リソースを速やかに解放
アプリケーションの例
Python アプリケーションの全体例
#!/usr/bin/env python3
from machbaseAPI import connect
import time
from datetime import datetime
class SensorMonitor:
def __init__(self):
self.conn = connect(host='127.0.0.1', port=5656, user='SYS', password='MANAGER')
def collect_data(self, sensor_id, value):
self.conn.append('sensors', [[sensor_id, datetime.now(), value]])
def get_recent_data(self):
cur = self.conn.cursor()
cur.execute("SELECT * FROM sensors DURATION 1 HOUR")
return cur.fetchall()
def close(self):
self.conn.close()
# 使用方法
monitor = SensorMonitor()
monitor.collect_data('sensor01', 25.3)
data = monitor.get_recent_data()
monitor.close()次のステップ
開発環境に合う SDK を選択してください。
- C/C++:CLI/ODBC リファレンス
- Java:JDBC リファレンス
- Python:Python SDK リファレンス
- .NET:.NET リファレンス
- Web/REST:配置環境でエンドポイントを利用できる場合は HTTP 連携を使用。
関連ドキュメント
最終更新日