注册用户享全站资源 并成为粉丝 不定时福利发放
 

Quartz学习笔记(四)使用druid连接池

5
发表时间:2018-11-10 15:42

quartz默认使用的是c3p0的连接池,记得有篇文章测试过c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool这四种连接池的性能。
大致给出的测试数据为Druid >Tomcat Jdbc Pool >c3p0 >Proxool,以上仅供参考。

最近项目老是报错,甚是让人烦恼,具体错误日志:

Thelast packet successfully received from the server was 56,268 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)        at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1127)        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3715)        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3604)        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4155)        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2832)        at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5357)        at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:756)        at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98)        at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.invoke(AttributeRestoringConnectionInvocationHandler.java:66)        at com.sun.proxy.$Proxy89.setAutoCommit(Unknown Source)        at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:799)        at org.quartz.impl.jdbcjobstore.JobStoreTX.getNonManagedTXConnection(JobStoreTX.java:71)        at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3796)        ... 2 more

从错误日志可以看出,底层错误是由于quartz引起的,导致数据库链接异常,一开始以为是数据库连接没有关闭导致的,所以quartz.properties中配置了自动关闭如下,但是重启后还是报错。
org.quartz.dataSource.myDS.autoCommitOnClose=true

尝试了N种方法,也修改了很多配置参数,但是都不起作用。这种问题不是经常出现,偶尔出现过,以前重启就好了,但是今天怎么都搞不定。

考虑到调度中心和平台系统的统一性和稳定性,需要深入调研数据源连接池的内部应用技术,同时扩展成为Druid连接池技术。

1.Quartz各版本数据库连接池技术更新情况
Quartz 2.0 以前 DBCP
Quartz 2.0 以后 C3P0(包含2.0)

2.本项目使用Quartz2.2.2,数据库连接池默认配置如下
在quartz.properties文件中的配置项:
org.quartz.dataSource.myDS(数据源名).connectionProvider.class:org.quartz.utils.PoolingConnectionProvider

3.扩展Druid数据库连接池配置调整如下
org.quartz.dataSource.myDS(数据源名).connectionProvider.class = XXXXX(自定义的ConnectionProvider)

4.自定义Druid数据库连接池,需要实现org.quartz.utils.ConnectionProvider接口,同时引入Druid相关的jar包,代码如下:

package com.acts.web.common.connection;import com.alibaba.druid.pool.DruidDataSource;import org.quartz.SchedulerException;import java.sql.Connection;import java.sql.SQLException;import org.quartz.utils.ConnectionProvider;/** * Druid连接池的Quartz扩展类 */publicclassDruidConnectionProviderimplementsConnectionProvider{   /*    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    *    * 常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。    *    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    *///JDBC驱动    public String driver;    //JDBC连接串    public String URL;    //数据库用户名    public String user;    //数据库用户密码    public String password;    //数据库最大连接数    publicint maxConnection;    //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。public String validationQuery;    privateboolean validateOnCheckout;    privateint idleConnectionValidationSeconds;    public String maxCachedStatementsPerConnection;    private String discardIdleConnectionsSeconds;    publicstaticfinalint DEFAULT_DB_MAX_CONNECTIONS = 10;    publicstaticfinalint DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;    //Druid连接池private DruidDataSource datasource;   /*    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    *    * 接口实现    *    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    */public Connection getConnection()throws SQLException {        return datasource.getConnection();    }    publicvoidshutdown()throws SQLException {        datasource.close();    }    publicvoidinitialize()throws SQLException{        if (this.URL == null) {           thrownew SQLException("DBPool could not be created: DB URL cannot be null");        }        if (this.driver == null) {            thrownew SQLException("DBPool driver could not be created: DB driver class name cannot be null!");        }        if (this.maxConnection < 0) {            thrownew SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!");        }       datasource = new DruidDataSource();        try{            datasource.setDriverClassName(this.driver);        } catch (Exception e) {            try {                thrownew SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);            } catch (SchedulerException e1) {            }        }        datasource.setUrl(this.URL);        datasource.setUsername(this.user);        datasource.setPassword(this.password);        datasource.setMaxActive(this.maxConnection);        datasource.setMinIdle(1);        datasource.setMaxWait(0);        datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS);        if (this.validationQuery != null) {            datasource.setValidationQuery(this.validationQuery);            if(!this.validateOnCheckout)                datasource.setTestOnReturn(true);            else                datasource.setTestOnBorrow(true);            datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);        }    }   /*    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    *    * 提供get set方法    *    * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   */public String getDriver(){        return driver;    }    publicvoidsetDriver(String driver){       this.driver = driver;    }    public String getURL(){        return URL;    }    publicvoidsetURL(String URL){        this.URL = URL;    }    public String getUser(){        return user;    }    publicvoidsetUser(String user){        this.user = user;    }    public String getPassword(){        return password;    }    publicvoidsetPassword(String password){        this.password = password;    }   publicintgetMaxConnection(){       return maxConnection;    }    publicvoidsetMaxConnection(int maxConnection){        this.maxConnection = maxConnection;    }   public String getValidationQuery(){        return validationQuery;    }   publicvoidsetValidationQuery(String validationQuery){        this.validationQuery = validationQuery;    }    publicbooleanisValidateOnCheckout(){       return validateOnCheckout;    }    publicvoidsetValidateOnCheckout(boolean validateOnCheckout){       this.validateOnCheckout = validateOnCheckout;    }    publicintgetIdleConnectionValidationSeconds(){        return idleConnectionValidationSeconds;    }    publicvoidsetIdleConnectionValidationSeconds(int idleConnectionValidationSeconds){        this.idleConnectionValidationSeconds = idleConnectionValidationSeconds;    }    public DruidDataSource getDatasource(){        return datasource;    }    publicvoidsetDatasource(DruidDataSource datasource){        this.datasource = datasource;    }    public String getDiscardIdleConnectionsSeconds(){        return discardIdleConnectionsSeconds;    }    publicvoidsetDiscardIdleConnectionsSeconds(String discardIdleConnectionsSeconds){        this.discardIdleConnectionsSeconds = discardIdleConnectionsSeconds;    }}

quartz.properties配置:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 5org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.dataSource = myDSorg.quartz.dataSource.myDS.connectionProvider.class:com.acts.web.common.connection.DruidConnectionProviderorg.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driverorg.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/acts_manage_alpha?characterEncoding=utf-8org.quartz.dataSource.myDS.user = rootorg.quartz.dataSource.myDS.password = 123org.quartz.dataSource.myDS.maxConnection = 5


会员登录

会员登录

登录免费下载全站资源

获取验证码
登录
登录
开发简历

开发简历

简历模板网站自取

入坑需谨慎

入坑需谨慎

高薪完全靠自己

微信赞助-Java帮帮社区

微信赞助-Java帮帮社区

非盈利性学习社区

支付宝赞助-Java帮帮社区

支付宝赞助-Java帮帮社区

将分享做到极致

大公司资讯
文章附图

近日,在美国推出满一年的Facebook视频服务Watch,宣布正式向全球推广,这预示着视频领域中,YouTube...

文章附图

据彭博社北京时间9月19日报道,科技行业最引人注目的法律大战可能正在进入尾声。据高通CEO史蒂夫·莫伦科夫(Ste...

Java帮帮公众号生态

Java帮帮公众号生态

总有一款适合你

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

Python帮帮-公众号

Python帮帮-公众号

人工智能,爬虫,学习教程

大数据驿站-微信公众号

大数据驿站-微信公众号

一起在数据中成长

九点编程-公众号

九点编程-公众号

深夜九点学编程

程序员服务区-公众号

程序员服务区-公众号

吃喝玩乐,听学吐画

Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
合作品牌 非盈利生态-优质内容分享传播者
关于我们
友链申请
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
全站内容非商业用途,内容来源于网友,并遵循 CC BY-NC 4.0 许可,如有异议请联系客服。
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部