首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >严重:无法使用context.xml文件创建池- tomcat 7的初始连接。

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

Stack Overflow用户
提问于 2014-03-03 19:44:00
回答 4查看 129.6K关注 0票数 10

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

但它抛出了很多例外,我不知道哪里出了问题。

这是控制台输出:

代码语言:javascript
复制
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.<init>(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片段

代码语言:javascript
复制
<resource-ref>
    <description>Travel Agency Datasource</description>
    <res-ref-name>jdbc/onlinedb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

context.xml

代码语言:javascript
复制
<Context>
    <Resource name="jdbc/onlinedb"
              type="javax.sql.DataSource"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              maxActive="20" maxIdle="10"
              maxWait="-1"
              username="root"
              password="secret"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/travelagency?characterEncoding=utf8"/>
</Context>

ConnectionManager类:

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
<resource-env-ref>
        <description>Travel Agency Datasource</description>
        <resource-env-ref-name>jdbc/onlinedb</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

但它一直在失败。

如何解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-03 19:46:46

您必须向类路径添加一个MySQL jdbc驱动程序。

要么将MySQL二进制jar放入tomcat 文件夹,要么将其添加到我们应用程序WEB/lib文件夹中。

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

票数 16
EN

Stack Overflow用户

发布于 2014-03-03 20:09:54

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

代码语言:javascript
复制
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/<yourwebapp>/WEB-INF/lib目录中)。

票数 9
EN

Stack Overflow用户

发布于 2014-05-07 01:18:28

在调整了一个完全工作的context.xml设置之后,我还处理了这个异常。我不想要context.xml中的环境细节,所以我删除了它们,并看到了这个错误。我意识到我必须在基于args的代码中完全创建这个数据源资源。

删除用户/pwd/主机的原始错误: org.apache.tomcat.jdbc.pool.ConnectionPool init严重:无法创建池的初始连接。

删除context.xml的全部内容,并尝试如下:在启动app服务器时初始化数据源对象,然后再使用第一个连接。如果使用Spring,则在@Bean Datasource构造函数中的@Configuration中可以这样做。

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

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22155837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档