Java 无法创建 PoolableConnectionFactory(未知数据库“XYZ_DEV”)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22397714/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:30:58  来源:igfitidea点击:

Cannot create PoolableConnectionFactory (Unknown database 'XYZ_DEV')

javamysqltomcatamazon-web-servicesamazon-ec2

提问by Pradeep Rajashekar

I have been trying to host a web application on AWS EC2 Ubuntu t1.micro instance.

我一直在尝试在 AWS EC2 Ubuntu t1.micro 实例上托管 Web 应用程序。

MySQL version: 5.5.35

MySQL 版本:5.5.35

Tomcat version: 7.0.52

Tomcat 版本:7.0.52

JDK version: 7.0_51

JDK 版本:7.0_51

The context for the webapp is:

webapp 的上下文是:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/XYZ" docBase="XYZ"
        debug="5" reloadable="true" crossContext="true">

<Resource name="jdbc/XYZ" auth="Container" type="javax.sql.DataSource" 
    factory="org.apache.commons.dbcp.BasicDataSourceFactory" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://127.0.0.1:3306/XYZ?characterEncoding=UTF-8"
    username="root" maxActive="100" maxIdle="50" removeAbandoned="true"
    useUnicode="true" autoReconnect="true"
    removeAbandonedTimeout="60" logAbandoned="true"
    password="root"/>
</Context>

The error that gets thrown when i start tomcat is as follows

启动tomcat时抛出的错误如下

AbandonedObjectPool is used (org.apache.commons.dbcp.AbandonedObjectPool@3f445d30)


LogAbandoned: true
   RemoveAbandoned: true
   RemoveAbandonedTimeout: 60
 WARN [localhost-startStop-1] (JDBCExceptionReporter.java:71) - SQL Error: 0, SQLState: null
ERROR [localhost-startStop-1] (JDBCExceptionReporter.java:72) - Cannot create PoolableConnectionFactory (Unknown database 'XYZ')
 WARN [localhost-startStop-1] (SettingsFactory.java:103) - Could not obtain connection metadata
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Unknown database 'XYZ')
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:855)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:72)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1881)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1174)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:805)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:745)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:134)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1198)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1167)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:249)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:245)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:188)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'XYZ'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
    at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:877)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)
    ... 33 more

My AWS security groups are set as follows

我的 AWS 安全组设置如下

Type     Protocol     PortRange    Source
MYSQL    TCP          3306         127.0.0.1/32
SSH      TCP          22           0.0.0.0/0
HTTP     TCP          22           0.0.0.0/0
HTTPS    TCP          22           0.0.0.0/0
All traffic      TCP          22           0.0.0.0/0

I checked the host that MySQL is running on

我检查了运行 MySQL 的主机

$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN   

If I try connecting to MySQL using

如果我尝试使用连接到 MySQL

mysql -u root -h 127.0.0.1 -D database_name -p

the connection works just fine.

连接工作正常。

Everything seems to be ok. Still I cant seem to find the reason the error is being thrown. Would really appreciate some expert advice.

一切似乎都没问题。我似乎仍然无法找到引发错误的原因。非常感谢一些专家的建议。

Thanks in advance.

提前致谢。

采纳答案by Pradeep Rajashekar

Found the solution. The reason I was getting the error is due to Linux version of MySQL being case sensitive to the database name. When I moved my entire stack from Windows to Linux I faced this problem.

找到了解决办法。我收到错误的原因是 Linux 版本的 MySQL 对数据库名称区分大小写。当我将整个堆栈从 Windows 迁移到 Linux 时,我遇到了这个问题。

Windows MySQL database names are not case-sensitive and Linux MySQL database names are case-sensitive.

Windows MySQL 数据库名称不区分大小写,Linux MySQL 数据库名称区分大小写。

回答by slayedbylucifer

Below rule is redundant. So remove it.

下面的规则是多余的。所以删除它。

MYSQL    TCP          3306         127.0.0.1/32


Your MySQL is listening on only localhost:

你的 MySQL 只监听本地主机:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     

This is not a problem as long as you are connecting to MySQL locally. But any remote connection to MySQl will fails. If this is the case, then change the MySQL binding to 0.0.0.0in my.cnf.

只要您在本地连接到 MySQL,这不是问题。但是任何到 MySQl 的远程连接都会失败。如果是这种情况,请将 MySQL 绑定更改为0.0.0.0in my.cnf



Before running you code, could you try connecting to the MySQL locally using the MySQL cli as below:

在运行代码之前,您可以尝试使用 MySQL cli 本地连接到 MySQL,如下所示:

mysql -u <username> -h 127.0.0.1 -p

If this connection works fine, then check whether you are able to connect fine with your jdbcdriver. Also, double check your jdbcsettings.

如果此连接工作正常,请检查您是否能够与jdbc驱动程序正常连接。另外,请仔细检查您的jdbc设置。