`
akhuting
  • 浏览: 121147 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring + c3p0数据源DEBUG信息

 
阅读更多
昨天晚上一个群友在群里问我一个问题。他当时在给Oracle 10g配置C3P0连接池。最起初呢,这家伙用的是ojdbc14.jar。写法是标准的Spring的写法,但是就是不行。后来我说,你换个包。换成classes12.jar看看。顺利执行了。

话说,后来又出了一个问题。他问我说,执行是执行了,但是出现个新的问题。

XXXX(1234567890123456) 19:02:17
新问题又出来了

XXXX(1234567890123456) 19:02:28

NewPooledConnection - com.mchange.v2.c3p0.impl.NewPooledConnection@1285252 closed by a client.
java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:566)
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyRe
source(C3P0PooledConnectionPool.java:470)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:96
4)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.ja
va:547)
C3P0PooledConnectionPool - Successfully destroyed PooledConnection: com.mchange.v2.c3p0.impl.NewPool
edConnection@1285252

我看到那个DEBUG,我说,是调试信息,修改一下LOG4J的等级就行了。

这个群友很不解的问,既然成功了,干嘛还要丢异常出来?

这里就不得不说到两个商业开发的原则问题了。

第一,对上家传入数据严加过滤,对传出给下家的数据仔细检查。

第二,合理使用异常。

第一点其实很简单的。也就是模块化开发的一个思想问题。对自己的行为负责。前端返回的数据究竟是什么,需要进行校验。不合格的剔除或者是修正。合格的处理完后,在传出之前也要加以校验,是否合格。

具体到这个问题里,就是来自Spring关于数据源的那个配置文件。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

//略去数据源相关信息的配置

</bean>


这个配置文件里,有两个信息是很管用的。一个是class,一个是destroy-method。简单点说,一个是数据源的实现类,一个是析构方法。Spring在读取这个配置文件以后,需要根据这些信息来实例化一些类,然后内部再根据中间的那些配置信息来实际构造数据源。比如username啥的。

可是来了个问题。不能保证这里的ComboPooledDataSource数据源一定是可用的,也不能保证close方法一定能关闭连接,对吧?Spring本身不能检查这个类是否真实有效,毫无Bug。实际上呢,也检查不了。同样的,close方法是否有效,也需要进行检查。这就是我刚才说的,对上家数据的严加检查。

那好吧,怎么检查呢?最简洁的方法莫过于实际构造一下,连接池,获取数据库连接,执行一个测试语句,然后关闭连接。如果一切都成功,那就OK。关于那个测试语句,配置过WebSphere数据源的同学们还记得不?有个SQL语句会默认的写在数据源配置里,是 " SELECT 1 FROM TABLE "。嗯,对的,这个就是测试语句。

这一套流程能走得通,走的顺,那么就可以在自己能力范围内说这个数据源和连接池是能用的,对吧?

这里补充一个知识。java.sql.Connection,这玩意不是class,是interface。

声明是:public interface Connection extends Wrapper 。

任何一个JDBC数据库连接的实现类都应该实现这个接口的全部方法。比如,close。API里的描述是,立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。

熟悉Java的同学们应该记得一点,在规范里有个要求,就是接口的实现类必须实现接口的所有方法。但是呢,这句话还有个意思,那就是,你可以在实现所有方法之外,再写几个方法。没人会管你。

啊哈,那就有疑问了。虽然API规定了close是关闭连接释放资源的。但这只是你接口的一厢情愿。也许人家实现厂家觉得close方法不够帅,要改成closeConnection。那。。。Spring总不好傻傻的去死扣close方法来关闭连接吧?虽然这方法必须实现,但是可没说一定要有内容啊。如果是空方法呢?

所以有了destroy-method这个配置项的出现。Spring说,不碍的,您老人家看哪个爽,告诉我就行。

现在测试完了。一切都成功了。

现在来看看第二个问题。合理使用异常。

又遇到一个问题。既然测试成功了,那总得给用户一点交待吧?难道说,测试成功了,就闷声大发财了?显然不合适嘛。可以试想一下,你是程序员,然后点了个按钮,测试。结果呢,实际上是测试成功了,但是系统啥动静都不给你。然后你傻傻的等痴痴的盼,一直等到天荒地老……嗯嗯,扯的有点远。如果你等一个小时还不见动静,活不见人死不见尸的,你说你会不会骂娘?

那么怎么通知才能保证一定有效呢?println?这个不见得一定能看到。因为别人也可能在同时输出信息,一下就刷掉了。那么有同学说了,最好是能暂停一下,我输出以后,就暂停了,不动了。

嗯,很好。

大家想想看,输出一大堆东西,然后此程序不动了,不继续执行了,这是啥玩意?

这不就是异常嘛!

只有异常能保证程序员一定能看到这个信息,比如,测试成功。这就是为什么Spring要采用这种方式来通知的原因。

这里呢,我想更正同学们一个习惯成自然的想法。异常不一定是通知坏消息的。异常就是异常,只要你愿意,你甚至可以在代码执行成功的时候,throws一个Exception。异常只不过是比较激烈的一种通知方式而已。无他,仅此而已。

现在又有个问题来了。既然要测试,而且每次执行到此处的时候都要测试一下。那么……难道都卡在这里不走了啊?显然更不合适啊。

熟悉log4J的同学应该看出来了,这是log4J输出的日志。很明显的,这种日志只应当在开发期间存在,不应该在发布期间存在。因为开发期间数据库变动很大,比如改表啊,改数据库配置啊。所以需要通知用户是否成功。但是产品一旦开发完毕,正式发布,这种信息就不应再出现,因为商业化运作的应用不允许乱动配置的,对不?

所以log4J提供了一种方法。消息级别。INFO的时候,是看不到这个异常的。实现起来也很好办,catch了,然后不做任何处理,也就是空的catch块。

具体实现的时候可以在catch里判断一下,如果等级是INFO的话,就不做任何事。如果不是,那就按照规则去做。

结合到 “合理使用异常” 这句话来说呢,就是说,需要抛出异常的时候,就抛出。不需要抛出的时候,就不抛出。对程序员来说,在必要的时候看到一串异常信息,是最合适的事情了。

关于异常的使用,这里不展开说了。有兴趣的同学可以参见林锐博士的 高质量Java编程。
分享到:
评论

相关推荐

    Spring +struts+c3p0 框架demo

    对于C3P0,需要设置数据源的bean,指定数据库连接的配置信息。 3. 在Struts的配置文件中,定义Action类与URL的映射,以及拦截器的配置。 4. 创建Action类,实现业务逻辑,并注入Spring管理的bean,如数据访问对象...

    SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip

    在本项目"SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip"中,开发者使用了SpringMVC4作为表现层,Spring4作为控制层和服务层,Hibernate4作为持久层,c3p0作为数据库连接池,以及MySQL作为数据库。...

    spring + c3p0 连接池

    然后,在Spring的配置文件(如`applicationContext.xml`)中添加C3P0的数据源配置: ```xml &lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt; &lt;!-- 更...

    spring-boot-mybatis+c3p0示例demo

    C3P0 是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在这个"spring-boot-mybatis+c3p0示例demo"中,我们将探讨如何将这三个组件结合在一起,构建一个简单但功能完备的数据库...

    springMVC+mybatis+Spring+C3P0+Oracle简单demo搭建下载部署就可以运行

    6. C3P0的配置也需在Spring配置文件中进行,包括数据源的初始化大小、最大连接数等。 7. 启动Tomcat服务器,访问应用的URL以查看应用是否正常运行。 通过这个简单的示例,你可以了解到如何将这些组件整合在一起,...

    Jbpm+Spring+hibernate+struts2+mysql+c3p0部署

    Jbpm+Spring+hibernate+struts2+mysql+c3p0项目部署

    SSH整合学习笔记之struts2+spring+hibernate+c3p0源码

    SSH整合是Java Web开发中的一个经典组合,由Struts2、Spring和Hibernate三大框架组成,再加上C3P0作为数据库连接池,形成了高效且灵活的应用架构。本学习笔记将深入探讨这四个组件如何协同工作,构建出强大的企业级...

    struts+spring+hibernate基础整合包+数据库Mysql+C3p0

    数据库的链接包是MySQl数据库,链接使用的C3P0 SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架 现在的结构是,Struts负责显示层,Hibernate负责持久层,Spring负责中间的...

    C3P0数据源

    配置 C3P0 数据源通常涉及以下几个步骤: 1. **引入依赖**:首先,你需要将 C3P0 的相关 JAR 包添加到项目的类路径中。例如,`c3p0-0.9.1.2.jar` 是核心库,`c3p0-0.9.1.2-jdk1.3.jar` 是针对 JDK 1.3 的版本,而 `...

    使用spring mvc+c3p0+jpa 框架搭建环境

    本基础框架采用 spring mvc+c3p0+jpa的配置方式,里面配置了spring事务管理,异常处理,登陆拦截器 等,全部自己动手搭建,经过测试通过。如果你苦于一个万能的java ee框架搭建,你可以参考。个人喜欢专研技术,但不...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    C3P0数据源.rar

    在SSM(Spring、Struts、MyBatis)框架中,C3P0数据源常被用于管理数据库连接,提高应用的性能和稳定性。下面将详细介绍C3P0数据源以及如何在配置式开发中使用它。 首先,`c3p0-0.9.5.2.jar`是C3P0的核心库,包含了...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

    spring 配置c3p0

    在Spring框架中,数据库连接管理是一项关键任务,而C3P0是一个开源的JDBC连接池,它提供了数据源管理,能有效提升数据库操作的性能和效率。本篇将详细介绍如何在Spring中配置C3P0连接池。 首先,我们需要理解C3P0的...

    spring4+hibernate+springmvc+c3p0

    4. **C3P0**:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了一套完善的数据库连接池管理机制,用于提高数据库连接的复用性和效率。 在描述中提到的"开发常用工具类"可能包括各种辅助类,如日期时间...

    spring+hibernate解决多数据源问题3.pdf

    在Spring+Hibernate的整合模式下,通常会在Spring的applicationContext.xml中配置数据源,并通过Spring的IoC容器将数据源注入到SessionFactory中。这样,SessionFactory就可以利用该数据源进行数据库的CRUD操作。 ...

    c3p0数据源jar包.zip

    3. 初始化数据源:在应用启动时,根据配置信息创建C3P0数据源的实例。 4. 获取和归还连接:在需要操作数据库时,通过数据源的getConnection()方法获取连接;操作完成后,必须调用Connection的close()方法,将连接...

    SSM - SpringMVC4 + Spring4 + mybatis3 + c3p0 + Mysql.rar

    4. **c3p0**:c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了一套完善的连接池管理机制。在这个项目中,c3p0用于管理数据库连接,提高数据库访问效率,减少创建和销毁连接的开销,同时实现连接的...

    ssm整合 - Spring4 + mybatis3 + c3p0(SQL Server).zip

    在这个项目中,我们看到的是Spring 4、MyBatis 3和c3p0数据源的整合,用于与SQL Server数据库进行交互。下面将详细介绍这三个组件以及它们在整合过程中的作用和配置。 **1. Spring框架** Spring是一个全面的企业级...

Global site tag (gtag.js) - Google Analytics