TDengine icon indicating copy to clipboard operation
TDengine copied to clipboard

java.sql.SQLException: JNI ERROR (2351): failed to create subscription

Open demodog111 opened this issue 3 years ago • 2 comments

### java.sql.SQLException: JNI ERROR (2351): failed to create subscription

import com.taosdata.jdbc.TSDBConnection; import com.taosdata.jdbc.TSDBDriver; import com.taosdata.jdbc.TSDBResultSet; import com.taosdata.jdbc.TSDBSubscribe;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Properties; import java.util.concurrent.TimeUnit;

public class SubscribeDemo1111 { // topic 是一个订阅的名字,可以自定义,但是需要保证在一台机器上不重复 private static final String topic = "topic_super_aggregate_state_01"; // sql 是订阅的条件 private static final String sql = "select * from super_aggregate_state";

public static void main(String[] args) {
	Connection connection = null;
	TSDBSubscribe subscribe = null;

	/**
	 * 数据订阅debug记录
	 * 1、首先创建一个TSDBSubscribe对象
	 * 2、设置订阅100次,每次订阅间隔1秒,防止频繁回调
	 * 3、消费数据,将符合sql结果的数据存入TSDBResultSet对象中
	 * 4、设置回调函数,回调函数中输出订阅结果
	 * 5、每成功订阅一次就count++,订阅不结束,程序不结束
	 * 6、当订阅数据获取到100次,则结束订阅
	 */

	try {
		// 获取连接对象

		connection =getConn();

		// 创建订阅对象
		// 但如果用户程序创建这个订阅后退出,当它再次启动并重新使用这个 `topic` 时,
		// `restart` 就会被用于决定是从头开始读取数据,还是接续上次的位置进行读取。
		// 本例中,如果 `restart` 是 true,用户程序肯定会读到所有数据。
		// 我们设置为false,只订阅最新的数据。
		subscribe = ((TSDBConnection) connection).subscribe(topic, sql, false); // 创建订阅
		// 设置订阅次数
		int count = 0;
		while (count < 100) {  // 订阅100次
			// wait 1 second to avoid frequent calls to consume
			TimeUnit.SECONDS.sleep(1);
			// consume 详细的可debug进去查看消费流程
			TSDBResultSet resultSet = subscribe.consume();
			if (resultSet == null) {
				continue;
			}
			// 获取结果集的元数据做一个简单的输出
			ResultSetMetaData metaData = resultSet.getMetaData();
			while (resultSet.next()) {
				int columnCount = metaData.getColumnCount();
				for (int i = 1; i <= columnCount; i++) {
					System.out.print(metaData.getColumnLabel(i) + ": " + resultSet.getString(i) + "\t");
				}
				System.out.println();
				count++;
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			if (null != subscribe)
				// close subscribe
				subscribe.close(true);
			if (connection != null)
				connection.close();
		} catch (SQLException throwable) {
			throwable.printStackTrace();
		}
	}
}

public static Connection getConn() throws Exception{

	Class.forName("com.taosdata.jdbc.TSDBDriver");
	String jdbcUrl = "jdbc:TAOS://192.168.3.127:6030/iot_data?user=root&password=taosdata&charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8";
	Connection connection = DriverManager.getConnection(jdbcUrl);
	return connection;
}

}

demodog111 avatar Aug 26 '22 08:08 demodog111

请问JDBCdemo 可以正常连接使用吗

yu285 avatar Aug 29 '22 11:08 yu285

我也遇到相同的问题了目前tdengine 2.6.0.28和2.6.0.22两个版本里的客户端和服务端分离部署时 数据订阅会出现问题,修改hostname等方式尝试了也是如此,我尝试了一下在td数据库服务端直接部署启动服务订阅数据是没有问题的

fengyunta avatar Nov 01 '22 08:11 fengyunta

2.x 版本目前官方已经不维护支持了,请迁移升级到最新的 3.x 版本吧。操作手册为:https://www.taosdata.com/tdengine-engineering/17753.html。3.x 和 2.x 相比是全方位更加优越的,关于3.x 的主要特性可以结合这篇文章和官方文档一起了解:https://www.taosdata.com/tdengine-engineering/21550.html

开源版3.x 支持操作系统参考:https://docs.taosdata.com/reference/support-platform/

yu285 avatar May 10 '24 09:05 yu285