Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Mysql 检查JDBC连接是否可写;使用preferredTestQuery或ConnectionTester_Mysql_Jdbc_C3p0 - Fatal编程技术网

Mysql 检查JDBC连接是否可写;使用preferredTestQuery或ConnectionTester

Mysql 检查JDBC连接是否可写;使用preferredTestQuery或ConnectionTester,mysql,jdbc,c3p0,Mysql,Jdbc,C3p0,当前设置: 服务主机(Java)连接到(JDBC)主数据库(MySQL),并有一个从数据库(只读)以确保可靠性 场景: 在翻转的情况下,我需要升级从到新的主。当前母版变为只读,新母版升级为读写。我希望使用测试查询(执行对数据库的可写查询)自动将C3P0连接池刷新到新主机 创意: 探索一种自动刷新JDBC连接池的方法,以便在出现翻转时连接到新主机(当前主机将是RO,从机将升级为RW,主机cname将更新) 当前配置 <property name="driverCla

当前设置:

服务主机(Java)连接到(JDBC)主数据库(MySQL),并有一个从数据库(只读)以确保可靠性

场景:

在翻转的情况下,我需要升级从到新的主。当前母版变为只读,新母版升级为读写。我希望使用测试查询(执行对数据库的可写查询)自动将C3P0连接池刷新到新主机

创意:

探索一种自动刷新JDBC连接池的方法,以便在出现翻转时连接到新主机(当前主机将是RO,从机将升级为RW,主机cname将更新)

当前配置

        <property name="driverClass" value="${DriverClass}" />
        <property name="jdbcUrl" value="${ReadWriteDatabaseURL}${AccountDatabaseName}${JDBCProperties}" />
        <property name="user" value="${ReadWriteDatabaseCredentials}.principal" />
        <property name="password" value="${ReadWriteDatabaseCredentials}.credential" />
        <property name="testConnectionOnCheckout" value="true"/>
        <property name="testConnectionOnCheckin" value="false" />
        <property name="preferredTestQuery" value="update existing_table set value = now() where id = 1;"/>
        <property name="maxIdleTime" value="44000"/>
        <property name="idleConnectionTestPeriod" value="30"/>
        <property name="maxStatements" value="50"/>
        <property name="minPoolSize" value="3"/>
        <property name="maxPoolSize" value="3"/>
        <property name="acquireIncrement" value="2"/>
        <property name="checkoutTimeout" value="15000"/>
        <property name="acquireRetryDelay" value="1000"/>

谢谢

我不能对更大的故障切换问题发表评论,但是您当然可以定义一个基本上可以做任何事情的
connectiontest
。 有关简明说明,请参见

c3p0
的内置ConnectionTester使用
语句。executeQuery(…)
因此
INSERT
s等可能无法工作。您的自定义
ConnectionTester
可以做任何它想做的事情。如果
preferredTestQuery
rootCauseOutParamHolder
设置为
null
,您应该确保它做了一些正常的事情


如果希望忽略
preferredTestQuery
,或者要求它为空(即如果设置了
preferredTestQuery
,则抛出
异常)。

是的,这正是问题所在。感谢你的帮助,史蒂夫,谢谢。我指的是你的过度堆积。并设置
com.mchange.v2.resourcepool.BasicResourcePool
的日志级别进行调试,发现
java.sql.SQLException:无法使用executeQuery()发出数据操作语句。
但是,我想知道它是如何使用
testConnectionOnCheckin
的,而不是
testConnectionOnCheckout
当使用testConnectionOnCheckin=true时,我能够切换到master并且没有问题。但是,如果使用
testConnectionOnCheckin
,则不会更新表值。我想知道
testConnectionOnCheckin
是否使用executeUpdate()?或者,如果忽略错误,则不确定如何将数据连接重置为新主机。无论是签入还是签出,测试都是相同的。但是,签入失败,虽然您应该能够将其写入日志,但在应用程序行为方面却不太明显。如果您使用
executeQuery
拒绝的“查询”,则在签出时测试时,您将始终无法获得连接。签入测试是异步的。您的应用程序不会出现问题,但在幕后,c3p0将始终销毁和重新获取,而不是重用签入连接(看起来已断开)。在故障切换方面,这似乎很好,因为重新获取可能总是来自最新的主控器。但就性能而言,它不会很好。它仍然比简单的连接获取要好,因为c3p0将异步批获取。但是你将通过连接进行转换,无论需要多少开销。
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:550) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:450) ~[spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    ... 42 more
Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118) ~[mchange-commons-java-0.2.10.jar:0.2.10]
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77) ~[mchange-commons-java-0.2.10.jar:0.2.10]
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:164) ~[spring-jdbc-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:550) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:450) ~[spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    ... 42 more
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@4c86da0c -- timeout at awaitAvailable()
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) ~[c3p0-0.9.5.1.jar:0.9.5.1]
    at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:164) ~[spring-jdbc-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:550) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final]
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:450) ~[spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    ... 42 more