Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日志中的“获取尝试失败”异常对应用程序没有影响(安装程序:Hibernate+c3p0)_Hibernate_Multi Tenant_C3p0 - Fatal编程技术网

日志中的“获取尝试失败”异常对应用程序没有影响(安装程序:Hibernate+c3p0)

日志中的“获取尝试失败”异常对应用程序没有影响(安装程序:Hibernate+c3p0),hibernate,multi-tenant,c3p0,Hibernate,Multi Tenant,C3p0,好吧,我这里有个奇怪的。我设置了一个应用程序,它使用配置为多租户的hibernate和配置为连接池的C3P0 一切正常,只是在我的日志中抛出了一个异常,我无法找到它的原因。。。奇怪的是,这个异常并没有影响到我的应用程序,它只是工作正常,即使异常总是被抛出4次,即使我什么都不做,只是启动服务器并等待。几秒钟后,它们会出现在日志中,就是这样 以下是例外情况和一些可能有用的基本配置: 2013-05-28 09:06:02 WARN BasicResourcePool:1841 - com.mcha

好吧,我这里有个奇怪的。我设置了一个应用程序,它使用配置为多租户的hibernate和配置为连接池的C3P0

一切正常,只是在我的日志中抛出了一个异常,我无法找到它的原因。。。奇怪的是,这个异常并没有影响到我的应用程序,它只是工作正常,即使异常总是被抛出4次,即使我什么都不做,只是启动服务器并等待。几秒钟后,它们会出现在日志中,就是这样

以下是例外情况和一些可能有用的基本配置:

2013-05-28 09:06:02 WARN  BasicResourcePool:1841 - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1d926e41 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'dbuser'. ClientConnectionId:07fa33fd-9de8-4235-b991-ac7e9e1ad437
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:254)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2908)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2234)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2220)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1326)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
会话工厂:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.multiTenancy=SCHEMA
            hibernate.tenant_identifier_resolver=xxx.xxx.hibernate.CurrentTenantIdentifierResolverImpl
            hibernate.multi_tenant_connection_provider=xxx.xxx.hibernate.MultiTenantConnectionProviderImpl

            hibernate.dialect=${hibernate.dialect}
            hibernate.use_sql_comments=${hibernate.debug}
            hibernate.show_sql=${hibernate.debug}
            hibernate.format_sql=${hibernate.debug}
        </value>
    </property>
</bean>
即使没有直接的答案,我对任何可能有助于我调查的评论或指导都很满意,所以只要把你得到的东西都发出去就行了。先谢谢你

编辑:

我发现初始连接失败的错误就在眼前,这只是对DBConnectionPool的passwordproperty的dbuserpassword的错误配置

这解决了部分问题,只留下了重复的初始值,如果按照下面的讨论,@Steve Waldman的答案很可能只是log4j的错误配置

总是4次,即使我什么也不做,只是启动服务器并等待

所以,考虑到您在服务器重启时观察到的情况,这并没有什么奇怪的。服务器关闭并重新启动时,c3p0尝试获取数据库连接,但失败。最终,默认情况下,在30秒后,c3p0声明失败,记录您看到的异常,并向等待连接的线程发出错误信号。听起来您的服务器重新启动需要约30秒以上的时间

您看到这四次可能意味着您有四个活动连接池,即有四个不同的dbusers活动,包括默认用户。每个c3p0数据源可能管理多个池,每个池对应一组身份验证凭据

如果您想消除这些消息,只需增加c3p0声明采集失败所需的时间。看和。如果要防止在重新启动期间偶尔向客户机抛出SQLException,请延长客户机超时时间,当前已将其设置为30秒

杂项注释:您正在使用慢速默认连接测试。我看到你用自动测试表做了实验,但是把它拆开了。你可以试着设置一个新的。可能只需选择1就可以了,就像SQL Server推荐的那样。这可能无关紧要,因为您正在异步进行所有连接测试,但至少可以减少测试的开销


祝你好运

谢谢你的全面回答。这听起来合乎逻辑,但仍有一些问题。1.该错误发生在服务器重新启动后约20秒,根据eclipse,这大约需要10秒,因此这与您提到的30秒默认超时相匹配。但是c3p0难道不能在10秒后连接上吗?2.您是否有任何理由可以想出为什么我会打开四个连接池,并且打开同一个dbuser?因为此错误总是针对同一用户。所以应该只有一个游泳池。我知道从片段中看不出这一点。但是任何提示都会有帮助。如果你愿意,你可以直接跟随。将记录器com.mchange.v2.resourcepool.BasicResourcePool配置为精细java.util.logging或调试,例如log4j。您将看到每个无法获取连接的故障都会逐一记录。如果真的只有一个dbuser和四个失败,那么在第一次成功之前的两分钟内,您应该会看到其中的120个失败。如果db重启只需要10秒,那就令人费解了。这不是c3p0数据源所经历的。您也可以尝试使用jconsole或更好的VisualVM+MBean插件实时观察。您可以非常直接地看到您打开了多少个池,我只是仔细观察了一下,同一个dbuser每秒有4次失败。此外,我甚至没有重新启动数据库服务器,只是简单地重新启动应用程序服务器。数据库服务器一直处于运行状态。除了奇怪的失败之外,似乎还以某种方式实例化了四个池。。。。现在我想知道为什么我的应用程序在内部会这样运行,即使它运行得很好xD感谢到目前为止的帮助和耐心:您是否看到四个不同的初始化横幅?c3p0池启动时,会发出类似初始化c3p0池的消息。。。com.mchange.v2.c3p0.ComboPooledDataSource,然后是大量配置信息。你看到其中四个了吗?
<c3p0-config> 
    <named-config name="c3p0name">  
        <property name="acquireIncrement">3</property>
        <!--property name="automaticTestTable">con_test</property--> 
        <property name="checkoutTimeout">30</property> 
        <property name="idleConnectionTestPeriod">30</property> 
        <property name="initialPoolSize">2</property> 
        <property name="maxIdleTime">18000</property> 
        <property name="maxPoolSize">30</property> 
        <property name="minPoolSize">2</property> 
        <property name="maxStatements">50</property>
        <property name="testConnectionOnCheckin">true</property>
    </named-config>
</c3p0-config>
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider  {


    private static final long serialVersionUID = 8074002161278796379L;

    ComboPooledDataSource cpds;

    public MultiTenantConnectionProviderImpl() throws PropertyVetoException {
        cpds = new ComboPooledDataSource("c3p0name");
        cpds.setDriverClass("jdbc.driver"));
        cpds.setJdbcUrl("jdbc.url"));
        cpds.setUser("dbuser");
        cpds.setPassword("dbuserpassword"));
    }


    @Override
    public Connection getAnyConnection() throws SQLException {
        return cpds.getConnection();
    }

    @Override
    public Connection getConnection(String dbuser) throws SQLException {
        return cpds.getConnection(dbuser, PropertyUtil.getCredential(dbuser));
    }