【问题标题】:preferredTestQuery never use with c3p0 0.9.5.2 and Tomcat 7preferredTestQuery 从不与 c3p0 0.9.5.2 和 Tomcat 7 一起使用
【发布时间】:2017-05-09 06:43:22
【问题描述】:

我将 tomcat7 与 c3p0-0.9.5.2 和 postgresql-9.3-1102-jdbc41 一起使用,preferredTestQuery(选择 1)从不使用,仅在产品中使用。

相同的配置在测试环境中工作正常(检查更新查询)。

在产品中有很多对 getTable postgresql 查询的调用。 (> 1000cpm - 新遗物数据)。

 <Resource name="jdbc/database_read_only"
          auth="Container"
          type="com.mchange.v2.c3p0.ComboPooledDataSource"
          description="Ma description"
          jdbcUrl="jdbc:postgresql://hostname:5432/mabase"
          driverClass="org.postgresql.Driver"
          user="monuser"
          password="monpassword"
          initialPoolSize="10"
          minPoolSize="10"
          maxPoolSize="100"
          acquireIncrement="10"
          maxIdleTime="300"
          maxConnectionAge="1800"
          connectionTesterClassName="com.mchange.v2.c3p0.impl.DefaultConnectionTester"
          preferredTestQuery="select 2"
          testConnectionOnCheckout="true"
          testConnectionOnCheckin="false"
          idleConnectionTestPeriod="300"
          maxIdleTimeExcessConnections="60"
          unreturnedConnectionTimeout="10"
          factory="org.apache.naming.factory.BeanFactory"/>

日志看起来不错:

 2016-12-23 15:26:10,138 : Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 10, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> ddsdsdsqd, debugUnreturnedConnectionStackTraces -> false, description -> ma description, driverClass -> org.postgresql.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> mytoken, idleConnectionTestPeriod -> 300, initialPoolSize -> 10, jdbcUrl -> jdbc:postgresql://hostname:5432/monapp, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 1800, maxIdleTime -> 300, maxIdleTimeExcessConnections -> 60, maxPoolSize -> 100, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, preferredTestQuery -> select 1, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]

为什么 c3p0 使用复杂请求而不是“选择 1”?

复杂请求示例:

SELECT * FROM (SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace

SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME,  CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'  WHEN true THEN CASE  WHEN n.nspname = 'pg_catalog' OR n.nspname = 'information_schema' THEN CASE c.relkind   WHEN 'r' THEN 'SYSTEM TABLE'   WHEN 'v' THEN 'SYSTEM VIEW'   WHEN 'i' THEN 'SYSTEM INDEX'   ELSE NULL   END  WHEN n.nspname = 'pg_toast' THEN CASE c.relkind   WHEN 'r' THEN 'SYSTEM TOAST TABLE'   WHEN 'i' THEN 'SYSTEM TOAST INDEX'   ELSE NULL   END  ELSE CASE c.relkind   WHEN 'r' THEN 'TEMPORARY TABLE'   WHEN 'i' THEN 'TEMPORARY INDEX'   WHEN 'S' THEN 'TEMPORARY SEQUENCE'   WHEN 'v' THEN 'TEMPORARY VIEW'   ELSE NULL   END  END  WHEN false THEN CASE c.relkind  WHEN 'r' THEN 'TABLE'  WHEN 'i' THEN 'INDEX'  WHEN 'S' THEN 'SEQUENCE'  WHEN 'v' THEN 'VIEW'  WHEN 'c' THEN 'TYPE'  WHEN 'f' THEN 'FOREIGN TABLE'  WHEN 'm' THEN 'MATERIALIZED VIEW'  ELSE NULL  END  ELSE NULL  END  AS TABLE_TYPE, d.description AS REMARKS  FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c  LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0)  LEFT JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class')  LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND dn.nspname='pg_catalog')  WHERE c.relnamespace = n.oid  AND c.relname LIKE 'availability_table' ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME 

我接受所有想法。

谢谢

【问题讨论】:

  • 为什么c3p0不使用preferredTestQuery?

标签: postgresql tomcat spring-data c3p0 newrelic


【解决方案1】:

我不认为你正在使用你认为你正在使用的东西。

针对 Postgres 的 JDBC 4.1 驱动程序运行的 c3p0-0.9.5.2 永远不会使用旧的默认表名查询。如果没有设置preferredTestQuery,它将使用Connection.isValid(...) 方法。我怀疑您的应用程序的 CLASSPATH 中某处有旧版本的 c3p0 和/或 Postgres JDBC。

请注意,您应该尝试追查您发布的内容的怪异之处。您实际配置的preferredTestQuery 是“select 2”,而日志中DataSource 的preferredTestQuery 是“select 1”。同样,您将 unreturnedConnectionTimeout 配置为 10,但在记录的配置中未设置 (0)。您正在记录一个与您正在配置的数据源相似但不同的数据源。

我怀疑生产环境中事情变得奇怪的原因是因为在您的生产环境而不是您的测试环境中,您有较旧的库(c3p0 和/或 postgres 驱动程序)和其他 DataSources 为较旧的应用程序设置。

请注意,c3p0 的语义非常稳定。如果您到处升级到 0.9.5.2,它不太可能损害您的旧应用程序。 (请务必包含其依赖项 mchange-commons-java 0.2.11 或更高版本。)

【讨论】:

  • 谢谢,事实上在同一个上下文中有两个数据源,一个是读写的,第二个是只读的。名称、主机、preferredTestQuery 和 unreturnedConnectionTimeout 是不同的。我最近升级了 c3p0 版本,但我没有检查 mchange-commons-java(test and prod env)。在应用程序和 tomcat 库中,jdbc 和 c3p0 看起来不错。我会检查 mchange-commons-java。
  • 在检查 mchange-commons-java 0.2.11 后嵌入。
【解决方案2】:

最后,

我更改请求:选择 1;通过一个简单的“从 singleRowTable 中选择值”
=>请求“从singleRowTable中选择值”被Newrelic记录了几次, =>首选查询工作。

详细查看请求后,以及链接stacktrace,她来自org.springframework.jdbc.core.simple.SimpleJdbcInsert。

事实上,SimpleJdbcInsert 被用作每个插入的原型。我将其更改为实例 dao 变量,并且 metaData 仅按实例请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2013-08-21
    • 1970-01-01
    • 2013-12-25
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多