數據庫鏈接池

題目描述

  Web系統一般會頻繁地訪問數據庫,若是每次訪問都建立新鏈接,性能會不好。爲了提升性能,架構師決定複用已經建立的鏈接。當收到請求,而且鏈接池中沒有剩餘可用的鏈接時,系統會建立一個新鏈接,當請求處理完成時該鏈接會被放入鏈接池中,供後續請求使用。 如今提供你處理請求的日誌,請你分析一下鏈接池最多須要建立多少個鏈接。java

1.1 輸入描述:

  輸入包含多組數據,每組數據第一行包含一個正整數n(1≤n≤1000),表示請求的數量。緊接着n行,每行包含一個請求編號id(A、B、C、……、Z)和操做(connect或disconnect)。mysql

1.2 輸出描述:

  對應每一組數據,輸出鏈接池最多須要建立多少個鏈接。算法

1.3 輸入例子:

6
A connect
A disconnect
B connect
C connect
B disconnect
C disconnect

 

1.4 輸出例子:

2

 

2 解題思路

  此題比較簡單,詳見代碼註釋。sql

3 算法實現

import java.util.*;

/**
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            n *= 2;
            List<String> request = new ArrayList<>(n);

            for (int i = 0; i < n; i++) {
                request.add(scanner.next());
            }
            System.out.println(maxConnection(request));
        }

        scanner.close();
    }

    /**
     * 求最大的鏈接數
     *
     * @param request 請求操做,兩個一組(a, b),a表示鏈接名稱,b表操做內容,connect或者disconnect
     * @return 最大的鏈接數
     */
    private static int maxConnection(List<String> request) {

        // 記錄最大的鏈接數
        int max = 0;
        // 保存鏈接數
        Set<String> conn = new HashSet<>(request.size() / 2);

        // 處理每個鏈接請求
        for (int i = 0, j = request.size(); i < j; i += 2) {
            String r = request.get(i);
            String o = request.get(i + 1);

            // 若是是鏈接操做就添加到鏈接池中
            if ("connect".equals(o)) {
                conn.add(r);

                // 當前鏈接池中的大小比以前記錄到的最大值還要大,就更新最大值
                if (conn.size() > max) {
                    max = conn.size();
                }
            }
            // 刪除鏈接
            else if ("disconnect".equals(o)) {
                conn.remove(r);
            }
        }

        return max;
    }
}

 

4 測試結果

這裏寫圖片描述

5 其它信息

相關文章
相關標籤/搜索