獲取 MySQL, Oracle, MongoDB 數據庫中所有表的數據量


關系型數據庫

package com.seliote.databasecountsnapshot.tool;

import com.seliote.databasecountsnapshot.pojo.RdbmsConfig;
import com.seliote.databasecountsnapshot.pojo.TableCount;
import lombok.extern.slf4j.Slf4j;

import java.sql.*;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

/**
 * RDBMS 相關操作工具類
 *
 * @author LiYangDi
 * @since 2019/12/13
 */
@Slf4j
public class RdbmsOperate {

    /**
     * 注冊數據庫驅動
     */
    public static void registerDrivers() throws ClassNotFoundException {
        log.info("Register drivers");
        // Oracle 驅動
        Class.forName("oracle.jdbc.OracleDriver");
        // MySQL 驅動
        //Class.forName("com.mysql.jdbc.Driver");
        Class.forName("com.mysql.cj.jdbc.Driver");
    }

    /**
     * 注銷數據庫驅動
     */
    public static void unregisterDrivers() {
        log.info("Unregister drivers");
        // 獲取加載器,下方需要判斷驅動是否是應用自身加載的
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // 獲取已加載的所有驅動
        Enumeration<Driver> driverEnumeration = DriverManager.getDrivers();
        while (driverEnumeration.hasMoreElements()) {
            Driver driver = driverEnumeration.nextElement();
            // 需要直接判斷是否是同一個對象,所以使用了 == 而不是 equals(.)
            if (driver.getClass().getClassLoader() == classLoader) {
                try {
                    // 注銷驅動
                    DriverManager.deregisterDriver(driver);
                } catch (SQLException exp) {
                    log.warn("Exception when unregister drivers: " + exp);
                }
            }
        }
    }

    /**
     * 獲取 RDBMS 數據源連接
     *
     * @return RDBMS 數據源
     */
    public static Connection getConnection(RdbmsConfig config) throws SQLException {
        log.info("Attempt to get DataSource list for: " + config);
        return DriverManager.getConnection(config.getUrl(),
                config.getUsername(),
                config.getPassword());
    }

    /**
     * 關閉所有 RDBMS 數據源連接
     *
     * @param connection RDBMS 數據源連接
     */
    public static void closeConnection(Connection connection) throws SQLException {
        log.info("Close connection: " + connection);
        connection.close();
    }

    /**
     * 獲取連接的表中所有數據量
     *
     * @param connection 連接對象
     * @return 表中所有數據量
     */
    public static List<TableCount> getTableCounts(Connection connection, String username) throws SQLException {
        log.info("Getting RDBMS tables counts");
        List<TableCount> tableCounts = new LinkedList<>();
        DatabaseMetaData databaseMetaData = connection.getMetaData();
        // 數據庫表元數據
        try (ResultSet resultSet = databaseMetaData.getTables(connection.getCatalog(),
                // 這個只對 Oracle 有用,設置成大寫的用戶名即可
                username.toUpperCase(),
                null,
                new String[]{"TABLE"})) {
            // 獲取表名
            while (resultSet.next()) {
                // 只獲取表類型
                String tableType = resultSet.getString("TABLE_TYPE");
                if (!tableType.equals("TABLE")) {
                    log.info("Table " + resultSet.getString("TABLE_NAME")
                            + " type is not `TABLE`");
                    continue;
                }
                // Oracle 下庫名是 null
                String databaseName = resultSet.getString("TABLE_CAT");
                String tableName = resultSet.getString("TABLE_NAME");
                long count = -1L;
                // 獲取行數
                //noinspection SqlNoDataSourceInspection
                try (PreparedStatement statement
                             = connection.prepareStatement("SELECT COUNT(*) FROM " + tableName)) {
                    try (ResultSet countResultSet = statement.executeQuery()) {
                        while (countResultSet.next()) {
                            count = countResultSet.getLong(1);
                        }
                    }
                }
                TableCount tableCount = new TableCount();
                tableCount.setDatabase(databaseName == null ? username : databaseName);
                tableCount.setTable(tableName);
                tableCount.setCount(count);
                tableCounts.add(tableCount);
                log.info("Get count success for " + tableName);
            }
        }
        return tableCounts;
    }
}

MongoDB

package com.seliote.databasecountsnapshot.tool;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.seliote.databasecountsnapshot.pojo.MongoConfig;
import com.seliote.databasecountsnapshot.pojo.TableCount;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;

import java.util.LinkedList;
import java.util.List;

/**
 * MongoDB 相關操作工具類
 *
 * @author LiYangDi
 * @since 2019/12/16
 */
@Slf4j
public class MongoOperate {

    /**
     * 獲取 Mongo 數據庫連接
     *
     * @param mongoConfig MongoDB 連接相關配置
     * @return MongoClient 連接對象
     */
    public static MongoClient getMongoClient(MongoConfig mongoConfig) {
        log.info("Attempt to get DataSource list for: " + mongoConfig);
        ServerAddress serverAddress = new ServerAddress(mongoConfig.getHost(), mongoConfig.getPort());
        MongoCredential mongoCredential = MongoCredential.createCredential(mongoConfig.getUsername(),
                mongoConfig.getDatabase(),
                mongoConfig.getPassword().toCharArray());
        // 空配置即可
        MongoClientOptions mongoClientOptions = MongoClientOptions.builder().build();
        return new MongoClient(serverAddress, mongoCredential, mongoClientOptions);
    }

    /**
     * 關閉 MongoClient 連接
     *
     * @param mongoClient 需要關閉的連接
     */
    public static void closeMongoClient(MongoClient mongoClient) {
        log.info("Close mongo client: " + mongoClient);
        mongoClient.close();
    }

    /**
     * 獲取表中數據量
     *
     * @param mongoClient MongoClient 連接
     * @return 庫中表的數據量
     */
    public static List<TableCount> getTableCounts(MongoClient mongoClient, String databaseName) {
        log.info("Getting MongoDB tables counts");
        List<TableCount> tableCounts = new LinkedList<>();
        // 庫
        MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
        // 遍歷表
        for (String collectionName : mongoDatabase.listCollectionNames()) {
            MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(collectionName);
            TableCount tableCount = new TableCount();
            tableCount.setDatabase(databaseName);
            tableCount.setTable(collectionName);
            tableCount.setCount(mongoCollection.countDocuments());
            tableCounts.add(tableCount);
            log.info("Get count success for " + collectionName);
        }
        return tableCounts;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM