【编程马拉松】【021-数据库连接池】

【编程马拉松算法目录】


【021-数据库连接池】【工程下载>>>】


1 题目描述



  Web系统通常会频繁地访问数据库,如果每次访问都创建新连接,性能会很差。为了提高性能,架构师决定复用已经创建的连接。当收到请求,并且连接池中没有剩余可用的连接时,系统会创建一个新连接,当请求处理完成时该连接会被放入连接池中,供后续请求使用。 现在提供你处理请求的日志,请你分析一下连接池最多需要创建多少个连接。

1.1 输入描述:



  输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤1000),表示请求的数量。紧接着n行,每行包含一个请求编号id(A、B、C、……、Z)和操作(connect或disconnect)。

1.2 输出描述:



  对应每一组数据,输出连接池最多需要创建多少个连接。

1.3 输入例子:


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

1.4 输出例子:


2

2 解题思路



  此题比较简单,详见代码注释。

3 算法实现


import java.util.*;

/**
 * Author: 王俊超
 * Time: 2016-05-13 09:57
 * CSDN: http://blog.csdn.net/derrantcm
 * Github: https://github.com/Wang-Jun-Chao
 * 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 其它信息



因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】

时间: 2024-10-03 22:53:35

【编程马拉松】【021-数据库连接池】的相关文章

牛客网编程练习之编程马拉松:数据库连接池

只需要两个变量即可,一个维护着连接池的当前连接数,一个维护着连接池的最大连接数. AC代码: import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author CC11001100 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in);

javaweb学习总结(三十九)——数据库连接池

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

MySql数据库连接池

1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行  (3).项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式. 2.采用连接池(示意图) 3.开源数据库连接池 (1).现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了Da

数据库连接池原理

——连接池用什么数据结构实现? —— 实现连接池的代码 —— 线程安全问题 [数据库连接池的设计思路及java实现][ http://blog.csdn.net/shijinupc/article/details/7836129] [Java的JDBC数据库连接池实现方法][ http://developer.51cto.com/art/200907/137300.htm ]   ?   [设计数据库连接池,要考虑哪些问题?] 1. 有一个简单的函数从连接池中得到一个 Connection. 2

数据库连接池的工作原理

对于共享资源,有一个很著名的设计模式:资源池(resource pool).该模式正是为解决资源频繁分配.释放所造成的问题.数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个了,使用完毕后再放回去.我们可以通过设定连接池最大数来防止系统无尽的与数据库连接.更为重要的是我们可以通过连接池的管理机制监视数据库连接使用数量,使用情况,为系统开发,测试以及性能调整提供依据. 连接池的相关问题分析: 1.并发问题.

Python实现Mysql数据库连接池

python连接Mysql数据库: Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的. python的数据库连接池包 DBUtils: DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.DBUtils来

数据库连接池(一)

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

Java使用独立数据库连接池(DBCP为例)

目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源,占用资源,释放资源,结束访问.非常的耗费时间和空间. 于是数据连接池技术便产生了,其原理就是在数据请求方和数据库之间建立一个数据库连接管理层.在系统启动的时候就分配一定数量的连接,并维护这些连接,保持最低数量的连接数.同时为了保护数据库和系统,设置一个最大连接数,缓解数据库的访问压力. 这样在每次

使用Java中的动态代理实现数据库连接池

2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度.很多的连接池 都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前