2016-12-23 3 views
0

tomcat7을 c3p0-0.9.5.2 및 postgresql-9.3-1102-jdbc41과 함께 사용하면 preferredTestQuery (select 1)는 제품에서만 사용되지 않습니다.preferredTestQuery는 c3p0 0.9.5.2 및 Tomcat 7과 함께 사용하지 않습니다

동일한 구성이 테스트 환경에서 잘 작동합니다 (업데이트 쿼리로 확인).

제품에는 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 요청이 아니라 "하나를 선택?" 복잡한 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는 모든 삽입에 대해 프로토 타입처럼 사용되었습니다. 이 인스턴스를 DAO 변수로 변경하고 metaData는 인스턴스별로 하나만 요청했습니다.

1

나는 당신은 당신이 작업하는 생각으로 노력하고 있습니다 생각하지 않습니다.

c3p0-0.9.5.2 Postgres의 JDBC 4.1 드라이버에 대해 실행되는 것은 이전의 기본 테이블 이름 쿼리가 될 수 없습니다. preferredTestQuery이 설정되지 않은 경우 Connection.isValid(...) 메서드를 사용합니다. 귀하의 응용 프로그램의 CLASSPATH 어딘가에 c3p0 및/또는 Postgres JDBC의 이전 버전이 있다고 의심됩니다.

게시 한 항목을 쫓아 내려 시도해야한다는 기이함이 있습니다. 실제로 구성된 preferredTestQuery은 "select 2"이며, 로그의 DataSource의 preferredTestQuery은 "select 1"입니다. 마찬가지로, unreturnedConnectionTimeout을 10으로 구성하지만 로깅 된 구성에서는 설정되지 않습니다 (0). 구성중인 것과 유사한 DataSource를 로깅합니다.

프로덕션 환경에서는 이상하지만 시험 환경에서는 그렇지 않기 때문에 오래된 응용 프로그램 용으로 오래된 라이브러리 (c3p0 및/또는 postgres 드라이버)와 기타 DataSources을 설치했기 때문에 프로덕션 환경에서 이상하게 느껴질 수 있습니다.

c3p0은 의미에 대해 매우 안정하다는 점에 유의하십시오. 모든 곳을 0.9.5.2로 업그레이드하면 기존 응용 프로그램에 해를 끼치 지 않을 것입니다. (그냥 mchange-commons-java 0.2.11 이후의 종속 관계를 포함해야합니다.) 마지막으로

+0

고마워. 사실 동일한 문맥에 두 개의 dataSource가있다. 하나는 read-write이고 다른 하나는 replicate base에있다.이름, 호스트, 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