严重:无法使用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/
目录中)。
调整完全工作的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;