严重:无法使用context.xml文件创建pool-tomcat 7的初始连接

我试图在tomcat 7.0.52上运行项目并通过context.xml文件初始化为DB。

但它抛出了一堆例外,我无法弄清楚那里有什么问题。

这是控制台输出:

 java.sql.SQLException: com.mysql.jdbc.Driver at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635) at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:486) at org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:144) at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116) at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103) at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554) at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242) at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) 

这是完整的堆栈跟踪 。

这是输出到tomcat catalina日志

web.xml的片段:

  Travel Agency Datasource jdbc/onlinedb javax.sql.DataSource Container  

context.xml

    

ConnectionManager类:

 public class ConnectionManager { private static Logger log = Logger.getLogger(ConnectionManager.class); public static Connection getConnection() throws SQLException { Connection con = null; try { Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinedb"); con = datasource.getConnection(); } catch (NamingException e) { log.error(e); } return con; } } 

mysql-connector-java-5.1.27-bin.jar被添加到cp:

旅行

我试图更改context.xml文件的内容:

  Travel Agency Datasource jdbc/onlinedb javax.sql.DataSource  

但它一直都在失败。

如何解决这个麻烦?

您必须将MySQL jdbc驱动程序添加到类路径中。

将MySQL二进制jar放到tomcat lib文件夹中或将其添加到我们的应用程序WEB-INF / lib文件夹中。

您可以找到二进制jar(相应地更改版本 ): https : //mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.27

当遇到这样的exception时,最有用的信息通常位于堆栈跟踪的底部:

 Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:366) ... at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) 

问题是Tomcat找不到com.mysql.jdbc.Driver 。 这通常是由包含MySQL驱动程序的JAR引起的,而不是Tomcat期望找到它的地方(即在webapps//WEB-INF/lib目录中)。

调整完全工作的context.xml设置后,我也处理了这个exception。 我不想在context.xml中使用环境细节,所以我把它们拿出来看到了这个错误。 我意识到我必须在基于System Property JVM -D args的代码中完全创建这个数据源资源。

仅删除了user / pwd / host的原始错误:org.apache.tomcat.jdbc.pool.ConnectionPool init SEVERE:无法创建池的初始连接。

删除了context.xml的全部内容并尝试此操作:在使用第一个连接之前的某个时间初始化应用服务器的数据源对象。 如果使用Spring,这在@Bean Datasource构造函数中的@Configuration bean中是很好的。

要使用的包:org.apache.tomcat.jdbc.pool。*

 PoolProperties p = new PoolProperties(); p.setUrl(jdbcUrl); p.setDriverClassName(driverClass); p.setUsername(user); p.setPassword(pwd); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery("SELECT 1"); p.setTestOnReturn(false); p.setValidationInterval(30000); p.setValidationQueryTimeout(100); p.setTimeBetweenEvictionRunsMillis(30000); p.setMaxActive(100); p.setInitialSize(5); p.setMaxWait(10000); p.setRemoveAbandonedTimeout(60); p.setMinEvictableIdleTimeMillis(30000); p.setMinIdle(5); p.setLogAbandoned(true); p.setRemoveAbandoned(true); p.setJdbcInterceptors( "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); ds.setPoolProperties(p); return ds;