java.sql.SQLException:无法从基础数据库获取连接

时间:2014-07-19 00:35:11

标签: java mysql hibernate

我正在使用Hibernate,MySQL连接有效,但我得到以下内容。 如何查看与其连接的连接字符串的更多详细信息?

ERROR SchemaUpdate - could not get database metadata
java.sql.SQLException: Connections could not be acquired from the underlying database!
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
        at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
        at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
        at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51)
        at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:168)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:356)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
        at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
        at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
        ... 10 more
ERROR SchemaUpdate - could not complete schema update
java.sql.SQLException: Connections could not be acquired from the underlying database!
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
        at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
        at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
        at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51)
        at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:168)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:356)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
        at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
        at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
        ... 10 more

ERROR JDBCExceptionReporter - Connections could not be acquired from the underlying database!
org.hibernate.exception.GenericJDBCException: Cannot open connection
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
        at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
        at com.sun.proxy.$Proxy0.beginTransaction(Unknown Source)

Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
        at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
        at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
        ... 15 more
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
        at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
        at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
        ... 18 more

这是我的hibernate xml:

<hibernate-configuration>
    <session-factory>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/test</property>

        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">xxxxxx</property>

        <property name="show_sql">false</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="hibernate.c3p0.max_statements">200</property>

        <property name="hibernate.c3p0.min_size">20</property>
        <property name="hibernate.c3p0.max_size">200</property>
        <property name="hibernate.c3p0.idle_test_period">300</property>
        <property name="hibernate.c3p0.timeout">300</property>

        <property name="hibernate.c3p0.max_statements">200</property>
        <property name="current_session_context_class">thread</property>

    </session-factory>
</hibernate-configuration>

4 个答案:

答案 0 :(得分:3)

我会建议两件事来解决这个问题: 首先,尝试用大写字母提及您的数据库名称。尽管db仍然不区分大小写,但有时它可以使用大写字符运行良好。

其次,由于您可能附加了会话工厂值的一些额外内容,可能会出现此问题。例如(我将采用我使用的代码并面对这个问题并摆脱它): 我的部分xml是这样的:

    <session-factory>
    <property name="hbm2ddl.auto">update</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.url">jdbc:mysql://10.184.56.183:3306/******?relaxAutoCommit=true&amp;autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8</property>
    <property name="connection.username">******</property>
    <property name="connection.password">******</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.connection.pool_size">5</property>
    <property name="hibernate.connection.shutdown">true</property>
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>
    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.min_size">2</property>
    <property name="hibernate.c3p0.max_size">5</property>
    <property name="hibernate.c3p0.timeout">108000</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">1000</property>
    <property name="hibernate.c3p0.validate">true</property>
    <property name="hibernate.c3p0.acquire_increment">5</property>       

因此,请继续修剪额外的值,例如清理数据库连接URL和其他内容。我也在从数据库表生成代码时遇到问题。所以我创建了一个不同的配置xml,并使其尽可能简单,就是这样。它非常好。

答案 1 :(得分:2)

在我的情况下,问题是c3p0-0.9.2.1.jar文件未被maven复制到routes :: [User] -> ScottyM () routes allUsers = do get "/users/:id" $ do id <- param "id" json ([x | x <- allUsers, userId x == id] !! 0) main = do conn <- open "data.db" users <- ( query_ conn "select id, first_name, second_name, team from users" :: IO [User] ) scotty 3000 (routes users)

答案 2 :(得分:1)

我遇到了这个问题,问题是我们的办公室IP地址被MySQL服务器阻止,因为许多连接尝试使用了错误的凭据。

确保您可以使用与应用程序相同的方法/网络连接到服务器。如果在尝试使用某些MySQL客户端(如Workbench)进行连接时得到此类或类似内容

Host 'XXX-XXX-XXX-XXX.static.XXXXXX.XXX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 

您的IP已被阻止,这就是问题所在。

答案 3 :(得分:0)

我通过关注Confluence Support文章解决了这一难题。

上述博客文章针对以下问题的原因和解决方案: cannot establish a connection to its database.

  1. 您输入的数据库配置详细信息不正确或具有 更改。例如,数据库名称或数据库 您的Confluence数据库的用户名/密码。确认 数据库中的用户名,密码和连接URL /confluence.cfg.xml不正确,如果不正确 相应地更新它们。

  2. 数据库的网址不正确。 例如,如果数据库连接为jdbc:mysql:// yma / confluence?autoReconnect = true,则主机“ yma”是否 是否存在,并且数据库服务器是否安装在“ yma”上?校验 /confluence.cfg.xml查找该条目。     数据库服务器未运行。如果您的数据库服务器已关闭,请重新启动它并检查日志以查看其为什么失败或 停止了。

  3. 网络已关闭(或者Confluence及其数据库之间存在防火墙)并且与数据库的连接 无法建立。如果您的网络已关闭,或者新的防火墙已关闭 已安装,请咨询系统管理员以获取进一步信息 故障排除。

  4. 您的数据库密码已过期。 如果您的密码已过期(并且只有在尝试连接到您的密码时才会发现此密码) 通过数据库客户端或外部数据库工具(例如, 作为DbVisualizer),请更新您的密码。您可能要停用 您的Confluence数据库用户的密码过期,以防止 问题再次发生。请务必向您的DBA咨询有关 这个。

  5. Postgres特定问题::在迁移或升级Confluence时,Postgres加密方法已更改或更改。 环境等。检查pg_hba.conf文件。如果设置了方法 确定将其更改为md5。

  6. MySQL特定问题::连接请求过多,触发了MySQL服务器,无法阻止Confluence进行任何操作 要求。有关解决方法,请参见这篇MySQL文章。

相关问题