2016-12-23 16 views
0

私はtomcat7をc3p0-0.9.5.2とpostgresql-9.3-1102-jdbc41で使用していますが、preferredTestQuery(select 1)は決して製品では使用されません。preferredTestQueryはc3p0 0.9.5.2とTomcat 7では使用しません

test env(更新クエリで確認)で同じ設定が正常に機能します。

この製品では、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はCOMPLEXE要求していない "1を選択" を使用する理由?複雑なrequeteの

サンプル:

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 

私はすべてのアイデアを取ります。

おかげ

+0

なぜc3p0はpreferredTestQueryを使用しないのですか? – julien

答えて

0

は私がリクエストを変更する:1を選択します。単一の "select value from singleRowTable"で
=> "singleRowTableからの値の選択"というリクエストは、Newrelicのほんの数分のログであり、 => preferredQueryの仕事です。

要求とリンクスタックトレースを詳細に調べた後、彼女はorg.springframework.jdbc.core.simple.SimpleJdbcInsertから来ています。

実際、SimpleJdbcInsertはすべての挿入に対してプロトタイプのように使用されていました。私はこの変数をインスタンス変数に変更し、metaDataはインスタンスごとにリクエストするだけでした。

1

私は、あなたが作業している何を考えて作業しているとは思いません。

c3p0-0.9.5.2 PostgresのJDBC 4.1ドライバに対して実行されても、古いデフォルトのテーブル名のクエリはありません。 preferredTestQueryが設定されていない場合、Connection.isValid(...)メソッドを使用します。私はあなたのアプリケーションのCLASSPATHのどこかにc3p0および/またはPostgres JDBCの古いバージョンがあると思います。

メモあなたが投稿したものを追いかけてみるべき奇妙なことがあります。実際に設定するpreferredTestQueryは「選択2」で、ログのDataSourceのpreferredTestQueryは「選択1」です。同様に、unreturnedConnectionTimeoutを10に設定しますが、ログに記録された設定ではunset(0)です。設定しているデータソースと似ていますが、同じではないデータソースもログに記録しています。

本番環境ではテスト環境ではなく、古いライブラリ(c3p0および/またはpostgresドライバ)と古いアプリケーション用に設定されたDataSourcesがあるため、本番環境で奇妙なことが起こると思われます。

c3p0は、そのセマンティクスについて非常に安定しています。 0.9.5.2にアップグレードすると、古いアプリケーションを傷つけることはまずありません。 (ただ、mchange-commons-java 0.2.11以降その依存関係を含めるようにしてください。)最後に

+0

ありがとう、実際には、同じコンテキストで2つのdataSourceがあります.1つは読み取りと書き込み、もう1つは複製ベースです。名前、ホスト、preferredTestQueryとunretrurnedConnectionTimeoutは異なります。私は最近c3p0 verionをアップグレードしますが、mchange-commons-java(testとprod env)はチェックしません。 appとtomcatのlibでは、jdbcとc3p0はうまく見えます。私はmchange-commons-javaをチェックします。 – julien

+0

チェック後mchange-commons-java 0.2.11が埋め込まれています。 – julien

関連する問題