一个dbcp问题的解决

背景

最近有个项目,是在用户原有的仓储系统中集成RFID硬件。用户希望我们在他们原系统上直接开发,添加相关的几个功能模块,以节约开发成本。
原系统使用JDK8,数据库SQLServer,Dao层hiberante5,连接池dbcp,JDBC版本是4.2。

问题

在使用原生sql实现一个查询时,发生了以下错误。

Exception in thread "JavaFX Application Thread" java.lang.AbstractMethodError: Method org/apache/commons/dbcp/DelegatingResultSet.getNString(Ljava/lang/String;)Ljava/lang/String; is abstract
    at org.apache.commons.dbcp.DelegatingResultSet.getNString(DelegatingResultSet.java)
    at org.hibernate.type.descriptor.sql.NVarcharTypeDescriptor$2.doExtract(NVarcharTypeDescriptor.java:62)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:260)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:256)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:252)
    at org.hibernate.loader.custom.ScalarResultColumnProcessor.extract(ScalarResultColumnProcessor.java:54)
    at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:83)
    at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:60)
    at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:413)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:769)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:985)
    at org.hibernate.loader.Loader.doQuery(Loader.java:943)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
    at org.hibernate.loader.Loader.doList(Loader.java:2615)
    at org.hibernate.loader.Loader.doList(Loader.java:2598)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
    at org.hibernate.loader.Loader.list(Loader.java:2425)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2153)
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:987)
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:148)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)

分析

从错误信息分析,数据sql查询没有问题,结果集已经获得,错误发生在将结果集SQL字符串类型NVarcharType转换为String类型时,原因是dbcp.DelegatingResultSet未实现getNString()这个虚方法。

查看了一下使用的dbcp.DelegatingResultSet,确实只实现了getString()方法而并没有看到getNString()。

呃,粗略搜索了一下解决方法,好像没有人遇到相同的问题,看来是哪里用得不对。。。但看到了有人遇到dbcp关于版本以起的一些问题,想着有可能也是版本问题,当前的dbcp版本是1.3。

DelegatingResultSet看着是对ResultSet接口的实现类。于是看了一下JDK8中关于ResultSet.getNString()的说明,如下,即JDK1.6以后加入,用于转换NCHAR、NVARCHAR、LONGNVARCHAR等sql类型。

    /**
     * Retrieves the value of the designated column in the current row
     * of this <code>ResultSet</code> object as
     * a <code>String</code> in the Java programming language.
     * It is intended for use when
     * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
     * and <code>LONGNVARCHAR</code> columns.
     *
     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
     * @return the column value; if the value is SQL <code>NULL</code>, the
     * value returned is <code>null</code>
     * @exception SQLException if the columnLabel is not valid;
     * if a database access error occurs
     * or this method is called on a closed result set
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
     * this method
     * @since 1.6
     */
    String getNString(String columnLabel) throws SQLException;

上dhcp官网看了一下,1.3版本确实是有够旧了啊,release时间是2010年,并且仅适用于Java 1.4-5.0

•DBCP 2.6.0 compiles and runs under Java 8 only (JDBC 4.2)
•DBCP 2.5.0 compiles and runs under Java 8 only (JDBC 4.2)
•DBCP 2.4.0 compiles and runs under Java 7 only (JDBC 4.1)
•DBCP 1.4 compiles and runs under Java 6 only (JDBC 4)
•DBCP 1.3 compiles and runs under Java 1.4-5.0 only (JDBC 3)

最新版本是2.2.6,适配的环境是Java8及JDBC 4.2,然而,看网友的一些文章说dbcp2相比dbcp有很多差异。

解决方法

升级版本:
1)将dbcp替换成2.2.6版本,
2)commons-pool2 同步替换为commons-pool2-2.6.1.jar
3)参考https://blog.csdn.net/ahuyangdong/article/details/78554058 一文修改
修改spring配置文件,主要是包名如下:

datasource类型:org.apache.commons.dbcp.BasicDataSource->org.apache.commons.dbcp2.BasicDataSource
参数:
maxWait -> maxWaitMillis
maxActive -> maxTotal

结果

getNString()问题解决。
初步测试原业务功能未受影响。

关于几种常用数据库连接池的对比

摘自:https://blog.csdn.net/qq_31125793/article/details/51241943
1:性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。

Springboot2默认数据库连接池是HikariCP,原因:代码量少、口碑好、速度最快、稳定可靠。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343