java table map_Java TableMapEventData.getTable方法代码示例

此博客展示了Java代码处理TableMap事件的过程。导入相关依赖后,处理TableMapEventData,更新表ID映射,连接数据库获取表元数据,包括列名和主键信息,若表无主键则抛出异常,成功获取且无SQL错误时保存元数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.github.shyiko.mysql.binlog.event.TableMapEventData; //导入方法依赖的package包/类

private void handleTableMap(TableMapEventData data) throws SQLException {

Pair tableUniqueName = new ImmutablePair(data.getDatabase(), data.getTable());

if (databaseNameToTableIdMap.containsKey(tableUniqueName)) {

// delete the id->info mapping

System.out.println("Removing old db info!");

long oldTableId = databaseNameToTableIdMap.get(tableUniqueName);

tableIdToDataMap.remove(oldTableId);

}

tableIdToDataMap.put(data.getTableId(), data);

databaseNameToTableIdMap.put(tableUniqueName, data.getTableId());

if (databaseNameToTableMetadata.containsKey(tableUniqueName)) {

return;

}

// lookup the data

TableMetadata tableMetadata = new TableMetadata();

String dbName = data.getDatabase();

String tableName = data.getTable();

// XXX I should close this connection!

Connection connection;

connection = DriverManager.getConnection(

"jdbc:mysql://" + hostname + ":" + port + "/" + dbName, // notice the dbname is here. mysql's jdbc driver requires it.

username,

password);

DatabaseMetaData databaseMetaData = connection.getMetaData();

// get column names

ResultSet rs = databaseMetaData.getColumns(null, null, tableName, null);

// what about failures to connect to database? Need to make sure that we catch the case where we add an empty list, and then fail (meaning, no column names)

ArrayList columnNames = new ArrayList();

while (rs.next()) {

String columnName = rs.getString("COLUMN_NAME");

// 1 based, but we don't care. We just add them in order. This

// assumes that the columns come in ORDINAL_POSITION order, but the

// docs for getColumns() says they do.

// String position = rs.getString("ORDINAL_POSITION");

columnNames.add(columnName);

}

tableMetadata.setColumnNames(columnNames);

// get primary keys

ResultSet rs2 = databaseMetaData.getPrimaryKeys(null, null, tableName);

List primaryKeyColumns = new ArrayList();

while (rs2.next()) {

primaryKeyColumns.add(rs2.getString("COLUMN_NAME"));

}

if (primaryKeyColumns.isEmpty()) {

throw new RuntimeException(String.format("Table %s.%s does not have a primary key!", data.getDatabase(), data.getTable()));

}

tableMetadata.setPrimaryKeys(primaryKeyColumns);

System.out.println(tableMetadata);

// Only upon successful lookup, with no sql errors, do we save the data.

databaseNameToTableMetadata.put(tableUniqueName, tableMetadata);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值