mysql数据库Too many connections 错误的解决过程记录

在做一个注册页面的时候,要用到ajax异步校验用户输入的信息是否正确,还得做用户名查重工作,所以需要频繁的访问数据库。我用的c3p0的一个操作数据库的utils是我自己在我看完学习视频之后做的,我做的utils和视频中做的不同的是:视频中做的utils是注册驱动、设置ComboPooledDataSource和获得connection分开,我做的是一个getConnection方法一步到位。平常使用数据库频率不高也就没发现什么问题,直到现在东窗事发......

昨天出现了错误Too many connections ;我还纳闷我每次用完连接都会关闭,为什么会Too many connections ...

使用命令  show full processlist; 发现居然有上2万个sleep连接,

一停止程序运行又只剩下一个链接(就是本机连接),

检查了一下代码,发现“创建连接池”和“取用连接”和“关闭连接”代码放在一起,导致了这样一个工作流程:

一个用户访问----->创建一个链接池(20个连接)--->取用一个连接----->关闭一个链接;

于是多次访问(多个用户访问)的时候就创建了多个连接池,但每一个用户都只关闭了其中一个链接,留下一堆链接;

比如,30个用户访问,每个用户访问都创建一个20个连接的连接池,总共创建了600个链接,但30个用户全部访问结束时,总共才关闭了30个链接,留下570个链接。

用户越来越多,导致无用的链接越来越多,所以就有了Too many connections

正确的使用数据库做法是:先设置ComboPooledDataSource;再调用一个链接,而且每次调用都要关闭;

参考以下程序(测试程序,不是注册程序)

public class C3p0 {
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    @Test
    public void name() throws Exception {//1000次测试
        setConnection();
        for(int i=0;i<1000;i++){
            Thread.sleep(200);
            operateDatabase();
            System.out.println(i);
        }
    }

    /**
     * 演示c3p0的使用方法
     * @project_name Day11
     * @class_name C3P0Demo
     * @author Dovinya
     * @data 2014-8-27 下午07:57:42
     * @version 1
     * @notes
     */  

    public void setConnection() {//设置ComboPooledDataSource
        try {
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/kxpro");
        dataSource.setUser("root");
        dataSource.setPassword("514079");
        dataSource.setMinPoolSize(5);//连接池最小连接数
        dataSource.setInitialPoolSize(20);//连接池创建时连接数
        dataSource.setMaxPoolSize(80);//连接池最大连接数
        dataSource.setAcquireIncrement(5);//链接用完时创建的连接数
        dataSource.setNumHelperThreads(5);//多线程执行,提升性能
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("没找到驱动");
        }
    }

        @Test
        public void operateDatabase() {  //使用链接
            Connection conn =null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
//              Class.forName("com.mysql.jdbc.Driver");
//              conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "123");
//              ps = conn.prepareStatement("select * from account");  

                conn =  dataSource.getConnection();
                ps = conn.prepareStatement("select * from login");
                rs = ps.executeQuery();
                while(rs.next()){
                    System.out.println(rs.getString("username"));
                }

                while(rs.next()){
                    String name = rs.getString("name");
                    System.out.println(name);
                }  

            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (SQLException e) {  

                        e.printStackTrace();
                    }finally{
                        rs=null;
                    }
                }  

                if(ps!=null){
                    try {
                        ps.close();
                    } catch (SQLException e) {  

                        e.printStackTrace();
                    }finally{
                        ps=null;
                    }
                }  

                if(conn!=null){
                    try {
                        conn.close();
                        System.out.println("conn yiguanbi");
                    } catch (SQLException e) {  

                        e.printStackTrace();
                    }finally{
                        conn=null;
                    }
                }             

            }
        }  

}

最重要的是ComboPooledDataSource 要作为成员变量,只执行一次,创建连接池,以后用户只需取用即可

时间: 2024-10-05 05:02:10

mysql数据库Too many connections 错误的解决过程记录的相关文章

windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法

重装MySQL,由于不知道重装之前的root密码,使用重装之后的密码连接Mysql数据,总报 ERROR 1130: host 'localhost' not allowed to connect to this MySQLserver,不能连接数据库,猜测用户权限和密码的问题. 1.用root用户登录mysql数据库 (1)停止MySQL服务,执行net stop mysql; (2)在mysql的安装路径下找到配置文件my.ini, 找到[mysqld]   输入:skip-grant-ta

linux服务器报No space left on device错误的解决过程记录

起因 今天在本地提交了点代码,但到服务器上git pull的时候提示No space left on device,第一反应是猜想可能硬盘满了(很有可能是log导致的),不过想想又觉得不太可能,这台服务器上只部署了一个应用,查看项目占用空间也不大. 解决过程 1.作为一个linux菜鸟,第一时间百度查关于查看硬盘使用情况的命令 [[email protected] ~]# df -h文件系统 容量 已用 可用 已用% 挂载点/dev/hda1 20G   2.4G  18G 13%  /tmpf

Amazon RDS MySQL数据库还原时 log_bin_trust_function_creators 错误解决办法

使用了Amazon AWS EC2免费云空间,数据库实例采用Amazon RDS.原来在Windows Server上有一个存在大量数据的MySQL数据库.现在需要在Amazon RDS上还原这个MySQL数据库,勾掉Views(因为它会要求SUPER权限,而Master User无此权限,毕竟是托管的RDS),只留下Tables,如下图(使用Navicat): 图1:勾掉Views,因为RDS上的Masteruser无Super权限,无法还原Views对象 但在还原时,仍然出现如下的错误信息:

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

Navicat for mysql 远程连接 mySql数据库10061、1045错误问题 (转)

远程使用Navicat for mysql 客户端软件连接 mySql数据时,连接出现 2003-Can’t connect to MySQL on ’192.168.1.2’(10061)错误时,是由于MySQL不准许远程连接. 修改方法如下: 1:在服务端MySQL文件夹下找到my.ini文件.修改bind-address=127.0.0.1 为 bind-address=0.0.0.0 (在MySQL 5的my.ini中未发现此项) 2:重新启动MySQL服务. 测试连接情况: 如果没有给

SQLServer 报错:用户、组或角色&#39;XXX&#39; 在当前数据库中已存在. 错误:15023解决方法

背景: 最近在迁移SQLServer数据库2008时,新建用户后,做用户映射时. SQLServer 报错:用户.组或角色'XXX' 在当前数据库中已存在. 错误:15023. 下面讲一下解决的方法. 分析:    将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户.    这种情况被称为存在"孤立用户".此时是不能通过新建登录或者是对同名登录授予对应数据库的"用户"权限来解决登录问题,    因为SQ

System.Web.Mail发邮件引发0x80040217错误的解决过程

 使用System.Web.Mail 写了一个发送邮件程序,一直都工作正常. 最近更换新邮件服务器后,发送邮件时出现0x80040217错误. 从网上搜了一下,有用的结果不多,有说是Web.Mail过时,要改用system.net.mail等等. 后来跟踪代码,发现是进行到验证的步骤时出的问题,于是尝试去掉"@域名",真的可以了. 那为什么不提示用户名错误呢,通过使用控制台telnet测试发现, 新邮件服务的连接,在任何指令出错后都会立即断开,从而引发代码0x80040217错误.

执行Hadoop job提示SequenceFile doesn&#39;t work with GzipCodec without native-hadoop code的解决过程记录

参照Hadoop.The.Definitive.Guide.4th的例子,执行SortDataPreprocessor作业时失败,输出的错误信息 SequenceFile doesn't work with GzipCodec without native-hadoop code! 根据提示初步猜测应该是没有加载到对应的库,怀疑是java的某个jar包没有加载到.根据提示搜索参考了一些解决方案,应该是hadoop native lib没有加载到,于是继续了解什么是hadoop native li

Navicat for mysql 远程连接 mySql数据库10061、1045错误

用navicat连接远程的mysql数据报错: 有朋友可能会碰到使用Navicat for mysql 远程连接 mySql数据库会提示10061.1045错误或 2003-Can't connect to MySQL on '192.168.1.2'(10061),这个原因是因为MySQL不准许远程连接. 最简单的办法是 MySQL远程配置 代码如下 复制代码 GRANT ALL PRIVILEGES ON *.* TO [email protected]'%' IDENTIFIED BY '