C3P0连接池与MYSQL的遗留连接问题 有没有更好一点的方法。现在检查过数据库连接都正常关闭了,不过MYSQL接受并发的或者海量的连接能力还是不如ORACLE。想请问一下,MYSQL怎么设置数据库连接池是比较好的方法,我用的是C3P0,因为HIBERNATE也是基于这个连接池之上开发的。能有更好的搭配方式,或者配置方式吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 C3P0 和 Proxool 是 Hibernate 开发小组推荐优先使用的方式. 另外还支持 DBCP 我认为C3P0 和Proxool 会有性能上的差异但是以你目前的情况估计换那个都一样,开二级缓存吧.在配合上应用级别的缓存,加强下硬件设施. 你的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; }} 呵呵 一直没看 确实楼上说的对.楼主改下,否则性能超底,相当于每次取连接创建了 // 初始化连接池 cpds.setInitialPoolSize(30);这些个连接 ,但只用到了一个. 谢谢楼上提供的意见,但是想了一下,将初始化连接放在构造器的做法是不错,从代码分析上来看,在每次前台调用后台都会先初始化这个类对象,然后再取连接,但是有一个问题,这个代码只满足了初始化一次,可以在同一个线程中取多个连接的需求,但是如果前台再点击一次查询或者连接数据库的请求,在servlet中会生成多线程的访问,这样如果是同时或者多个操作,一样会有同样多的类初始化对象,如果每个对象只取一次连接,初始化数和连接数是相等的。 // 创建数据源连接池对象 ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setInitialPoolSize(30); 这些个连接 ,但只用到了一个. 谢谢sunyujia,yaray的提示,现在压力测试已经过了,我对自己的代码做了修改。总结出一个非常重要的知识点,现在就拿出来和大家分享一下首先是yaray提供的代码,这样写是比较符合规范的,之前由于在开发时没注意到,但也存在一个致命问题。其次时sunyujia的硬件优化问题,如果盲目的优化硬件,这样本质问题没有解决,会带来更大的开发代价。解决这个问题,其核心地方是要解决一个初始化问题,就是一次初始化,多次调用。通过一个实例对象,来为系统服务,生成多次连接,其核心在于static静态变量的引用,解决这个问题,必须将 private ComboPooledDataSource cpds做为静态成员来用,使服务器第一次加载时,将实例对象加载入内存中,从而避免每次实例化ComboPooledDataSource时都实例化数据库连接内容。而且对static的使用,还涉及到一个共享内存的使用,由于ComboPooledDataSource实例不用改变其内存,所以可共享调用,在第一次访问系统时,系统就自动实例化了这个对象。其以后的调用都是调用第一次实例化的对象,所以在第一次实例化对象时,加载的连接池大小等设置,在以后的连接访问中就生效了。而yaray的代码,还是存在每次实例化ConnectionProvider类,都会实例化ComboPooledDataSource对象,其每次调用连接池,还是会初始化连接池配置。在开发中要小心对static的使用,用得好,至少会提高系统10%的性能。谢谢大家的支持 其实这个时候就体现出spring的好处了,有了spring的注入,程序更加清晰,一般来说也不会出现楼主的问题,个人见解. 嗯,其实yaray的代码中,获取ConnectionProvider类对象时采用单态模式就可以基本解将LZ的问题了. 发愁了一下午的问题。百度能看的都看了,还是不行,请高手。 这段freemarker 标签整成struts2的标签是什么样子的 求解,关于spring装载bean时单例的疑惑 一道Java题 JMS客户端发送消息发如何得到属于自己的返回消息 急急!!hibernate left join 取join表字段值为null?? jdbc是否有锁定数据库表和解锁数据库表的功能呀(在线等待) J2EE安装问题 這個是啥問題?高分求助~~~~~~~~~ TimingAspect 使用报错,求指点! j2ee帮助文档 IBATIS中sqlmap可以用$符号吗???
另外还支持 DBCP
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; }
}
// 初始化连接池
cpds.setInitialPoolSize(30);
这些个连接 ,但只用到了一个.
ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setInitialPoolSize(30);
这些个连接 ,但只用到了一个.
首先是yaray提供的代码,这样写是比较符合规范的,之前由于在开发时没注意到,但也存在一个致命问题。其次时sunyujia的硬件优化问题,如果盲目的优化硬件,这样本质问题没有解决,会带来更大的开发代价。
解决这个问题,其核心地方是要解决一个初始化问题,就是一次初始化,多次调用。通过一个实例对象,来为系统服务,生成多次连接,其核心在于static静态变量的引用,解决这个问题,必须将 private ComboPooledDataSource cpds做为静态成员来用,使服务器第一次加载时,将实例对象加载入内存中,从而避免每次实例化ComboPooledDataSource时都实例化数据库连接内容。而且对static的使用,还涉及到一个共享内存的使用,由于ComboPooledDataSource实例不用改变其内存,所以可共享调用,在第一次访问系统时,系统就自动实例化了这个对象。其以后的调用都是调用第一次实例化的对象,所以在第一次实例化对象时,加载的连接池大小等设置,在以后的连接访问中就生效了。而yaray的代码,还是存在每次实例化ConnectionProvider类,都会实例化ComboPooledDataSource对象,其每次调用连接池,还是会初始化连接池配置。
在开发中要小心对static的使用,用得好,至少会提高系统10%的性能。
谢谢大家的支持