A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tuanjie 中级黑马   /  2014-1-12 12:48  /  1070 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tuanjie 于 2014-1-12 12:57 编辑

最近使用C3P0数据源实现数据库的操作时,才开始没有什么问题,对数据库的增、删、改、查都可以正常运行,但是运行一段时间后,就报了一下异常,连接数据库失败,其中异常信息为:
  1. 严重: Servlet.service() for servlet [CheckTeacherServlet] in context with path [/hactcmOAMS] threw exception
  2. com.hactcm.oams.exception.DaoException: java.sql.SQLException: Connections could not be acquired from the underlying database!
  3.         at com.hactcm.oams.dbc.DatabaseConnection.getConnection(DatabaseConnection.java:34)
  4.         at com.hactcm.oams.dao.proxy.OAMSDAOProxy.<init>(OAMSDAOProxy.java:15)
  5.         at com.hactcm.oams.dao.factory.OAMSDAOFactory.getOAMSDAOInstance(OAMSDAOFactory.java:16)
  6.         at com.hactcm.oams.service.impl.OAMSServiceImpl.<init>(OAMSServiceImpl.java:18)
  7.         at com.hactcm.oams.service.proxy.OAMSServiceProxy.<init>(OAMSServiceProxy.java:20)
  8.         at com.hactcm.oams.service.factory.OAMSServiceFactory.getOAMSService(OAMSServiceFactory.java:19)
  9.         at com.hactcm.oams.manager.ajaxServlet.CheckTeacherServlet.doGet(CheckTeacherServlet.java:26)
  10.         at com.hactcm.oams.manager.ajaxServlet.CheckTeacherServlet.doPost(CheckTeacherServlet.java:43)
  11.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
  12.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
  13.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
  14.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  15.         at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
  16.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  17.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  18.         at com.hactcm.oams.filter.role.LoginRoleFilter.doFilter(LoginRoleFilter.java:22)
  19.         at com.hactcm.oams.filter.HttpFilter.doFilter(HttpFilter.java:33)
  20.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  21.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  22.         at com.hactcm.oams.filter.character.CharacterFilter.doFilter(CharacterFilter.java:27)
  23.         at com.hactcm.oams.filter.HttpFilter.doFilter(HttpFilter.java:33)
  24.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  25.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  26.         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
  27.         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
  28.         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
  29.         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
  30.         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
  31.         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
  32.         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  33.         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
  34.         at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
  35.         at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
  36.         at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2430)
  37.         at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2419)
  38.         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  39.         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  40.         at java.lang.Thread.run(Thread.java:744)
  41. Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
  42.         at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
  43.         at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:689)
  44.         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
  45.         at com.hactcm.oams.dbc.DatabaseConnection.getConnection(DatabaseConnection.java:29)
  46.         ... 37 more         //这里是我自己写的DatabaseConnection类
复制代码

而我的c3p0-config.xml文件的内容是:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <c3p0-config>
  3.         <default-config>
  4.                 <property name="initialPoolSize">10</property>
  5.                 <property name="maxPoolSize">15</property>
  6.                 <property name="driverClass">com.mysql.jdbc.Driver</property>
  7.                 <property name="jdbcUrl">jdbc:mysql://localhost:3306/oetqms</property>
  8.                 <property name="user">root</property>
  9.                 <property name="password">123456</property>
  10.         </default-config>
  11. </c3p0-config>
复制代码
连接数据库的类是DatabaseConnection.java
  1. import java.sql.Connection;
  2. import java.sql.SQLException;

  3. import javax.sql.DataSource;

  4. import com.hactcm.oams.exception.DaoException;
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;

  6. public class DatabaseConnection {

  7.         // 创建一个 ThreadLocale 对象 集合,以当先的线程作为key
  8.         private  ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

  9.         private  DataSource ds = new ComboPooledDataSource();

  10.         /**
  11.          * 获得Connection对象
  12.          *
  13.          * @return Connection
  14.          * */
  15.         public Connection getConnection(){
  16.                 try {
  17.                         // 不用每次都创建连接 从tl中取出当先线程绑定的连接返回
  18.                         Connection conn = tl.get();
  19.                         // 第一次来 线程并未绑定任何的连接
  20.                         if (conn == null) {
  21.                                 conn = ds.getConnection();
  22.                                 tl.set(conn);
  23.                         }
  24.                         return conn;
  25.                 } catch (SQLException e) {
  26.                         throw new DaoException(e);
  27.                 }
  28.         }

  29.         // 开启事务
  30.         public  void startTransaction() {

  31.                 try {
  32.                         // 获得连接
  33.                         Connection conn = getConnection();
  34.                         // 开启事务
  35.                         conn.setAutoCommit(false);
  36.                 } catch (SQLException e) {
  37.                         throw new DaoException(e);
  38.                 }

  39.         }

  40.         // 提交事务
  41.         public void commit() {

  42.                 try {
  43.                         // 获得连接
  44.                         Connection conn = tl.get();
  45.                         if (conn != null)
  46.                                 // 提交事务
  47.                                 conn.commit();
  48.                 } catch (SQLException e) {
  49.                         throw new DaoException(e);
  50.                 }

  51.         }

  52.         // 回滚事务
  53.         public void rollback() {
  54.                 try {
  55.                         // 获得连接
  56.                         Connection conn = tl.get();
  57.                         if (conn != null)
  58.                                 // 回滚事务
  59.                                 conn.rollback();
  60.                 } catch (SQLException e) {
  61.                         throw new DaoException(e);
  62.                 }
  63.         }

  64.         // 关闭连接 关闭线程上绑定的连接
  65.         public void close() {
  66.                 // 从集合中移除当前线程绑定的conn
  67.                 try {
  68.                         // 判断线程上是否绑定连接 Connection
  69.                         Connection conn = tl.get();
  70.                         if (conn != null) {
  71.                                 try {
  72.                                         // 关闭连接
  73.                                         conn.close();
  74.                                 } finally {
  75.                                         // 从集合中移除当前线程绑定的conn
  76.                                         tl.remove();
  77.                                         conn = null;
  78.                                 }
  79.                         }
  80.                         System.out.println(conn);
  81.                 } catch (SQLException e) {
  82.                         throw new DaoException(e);
  83.                 }

  84.         }
  85. }
复制代码
每次出现异常,都指向这句代码conn = ds.getConnection();,这句代码的意思是从数据源中取出一个Connection对象。
每次出现异常后重新启动tomcat服务器就没有问题了,运行一段时间又出现相同的问题,这是什么原因啊?


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马