有没有更好一点的方法。现在检查过数据库连接都正常关闭了,不过MYSQL接受并发的或者海量的连接能力还是不如ORACLE。
想请问一下,MYSQL怎么设置数据库连接池是比较好的方法,我用的是C3P0,因为HIBERNATE也是基于这个连接池之上开发的。
能有更好的搭配方式,或者配置方式吗?

解决方案 »

  1.   

     C3P0 和 Proxool  是 Hibernate 开发小组推荐优先使用的方式.
     另外还支持  DBCP
      

  2.   

    我认为C3P0 和Proxool  会有性能上的差异但是以你目前的情况估计换那个都一样,开二级缓存吧.在配合上应用级别的缓存,加强下硬件设施.
      

  3.   

    你的getConnection()方法写得有问题(初始化部分需要移出去,且只需初始化一次),修改如下://package ....;//import ....;public class ConnectionProvider {    private ComboPooledDataSource cpds;    public ConnectionProvider() {
            initConnectionProvider();
        }    private void initConnectionProvider() {        try {
                // 创建数据源连接池对象
                cpds = new ComboPooledDataSource();            // 设置MYSQL驱动
                cpds.setDriverClass(Constants.DBMS_DRIVER);            // 连接URL
                cpds.setJdbcUrl( Constants.DBMS_URL );            // 设置用户账号
                cpds.setUser(Constants.DBMS_USER);            // 设置用户密码
                cpds.setPassword(Constants.DBMS_PASSWORD);            // 自动事务提交
                cpds.setAutoCommitOnClose(false);            // 设置最小连接数
                cpds.setMinPoolSize(5);            // 设置最大连接数
                cpds.setMaxPoolSize(30);            // 设置statement连接数
                cpds.setMaxStatements(20);            // 初始化连接池
                cpds.setInitialPoolSize(30);            cpds.setMaxIdleTime(60);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }    public Connection getConnection() throws PropertyVetoException, SQLException {        Connection connect = cpds.getConnection();        return connect;    }
    }
      

  4.   

    呵呵 一直没看 确实楼上说的对.楼主改下,否则性能超底,相当于每次取连接创建了 
    // 初始化连接池
                cpds.setInitialPoolSize(30);
    这些个连接 ,但只用到了一个.
      

  5.   

    谢谢楼上提供的意见,但是想了一下,将初始化连接放在构造器的做法是不错,从代码分析上来看,在每次前台调用后台都会先初始化这个类对象,然后再取连接,但是有一个问题,这个代码只满足了初始化一次,可以在同一个线程中取多个连接的需求,但是如果前台再点击一次查询或者连接数据库的请求,在servlet中会生成多线程的访问,这样如果是同时或者多个操作,一样会有同样多的类初始化对象,如果每个对象只取一次连接,初始化数和连接数是相等的。
      

  6.   

    // 创建数据源连接池对象 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setInitialPoolSize(30); 
    这些个连接 ,但只用到了一个. 
      

  7.   

    谢谢sunyujia,yaray的提示,现在压力测试已经过了,我对自己的代码做了修改。总结出一个非常重要的知识点,现在就拿出来和大家分享一下
    首先是yaray提供的代码,这样写是比较符合规范的,之前由于在开发时没注意到,但也存在一个致命问题。其次时sunyujia的硬件优化问题,如果盲目的优化硬件,这样本质问题没有解决,会带来更大的开发代价。
    解决这个问题,其核心地方是要解决一个初始化问题,就是一次初始化,多次调用。通过一个实例对象,来为系统服务,生成多次连接,其核心在于static静态变量的引用,解决这个问题,必须将 private ComboPooledDataSource cpds做为静态成员来用,使服务器第一次加载时,将实例对象加载入内存中,从而避免每次实例化ComboPooledDataSource时都实例化数据库连接内容。而且对static的使用,还涉及到一个共享内存的使用,由于ComboPooledDataSource实例不用改变其内存,所以可共享调用,在第一次访问系统时,系统就自动实例化了这个对象。其以后的调用都是调用第一次实例化的对象,所以在第一次实例化对象时,加载的连接池大小等设置,在以后的连接访问中就生效了。而yaray的代码,还是存在每次实例化ConnectionProvider类,都会实例化ComboPooledDataSource对象,其每次调用连接池,还是会初始化连接池配置。
    在开发中要小心对static的使用,用得好,至少会提高系统10%的性能。
    谢谢大家的支持
      

  8.   

    其实这个时候就体现出spring的好处了,有了spring的注入,程序更加清晰,一般来说也不会出现楼主的问题,个人见解.
      

  9.   

    嗯,其实yaray的代码中,获取ConnectionProvider类对象时采用单态模式就可以基本解将LZ的问题了.