2013-06-10 4 views
3

JNDI 리소스를 통해 tomcat 연결 풀을 사용하고 있습니다. context.xml에서MySQL에서 쿼리 캐싱 방지

:

<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" 
      username="myusr" password="mypwd" driverClassName="com.mysql.jdbc.Driver" 
      maxActive="1000" maxIdle="100" maxWait="10000" 
      url="jdbc:mysql://localhost:3306/mydatabase" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" /> 

web.xml에서는 :

<resource-ref> 
<description>DB Connection</description> 
<res-ref-name>jdbc/mydb</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
</resource-ref> 

데이터베이스는 MySQL의 하나입니다.

예를 들어 제품 목록과 같은 일부 정보를 선택하면 제품을 삽입하거나 삭제 한 후에도 같은 목록이 표시됩니다.

어떻게 방지합니까? 이 경우 업데이트 된 목록을 보게됩니다.

을 편집 query_cache_size은 0이다 query_cache_type

는 ON이다.

그래서 문제가 될 수 있습니까? 왜 쿼리 캐싱이 발생합니까?

편집 나는 "쿼리 캐시를 RESET"과 "FLUSH TABLES"에 대해 읽어보십시오.

그들 사이의 차이점은 무엇입니까?

그 중 하나를 사용하면 경매/전자 상거래 시나리오에 문제가있을 수 있습니까?

+0

MySQL의 관점에서 볼 때,'SELECT SQL_NO_CACHE'는 질의 캐시의 온/오프에 관계없이 질의 캐시 검사를 건너 뛰는 SELECT를 실행합니다. – RolandoMySQLDBA

+0

@eggyal : 예. 나는 그것을 자동으로 수여했다. – Sefran2

+0

@eggyal : 전에, 나는 대답을 받아 들였습니다. 이제, 나는 그것을 수여했다. – Sefran2

답변

5
Consistent Nonlocking Reads 아래의 문서로

:

거래 isolation levelREPEATABLE READ (기본 수준) 인 경우, 모든 일관성이 동일한 트랜잭션 내에서 읽기는 트랜잭션에서 최초의 읽기에 의해 설립 된 스냅 샷을 읽어 보시기 바랍니다. 현재 트랜잭션을? 미트 한 후 u로운 u 리를 _ 행하면 u 리에 대한보다 f 상한 스 냄샷을 얻을 수 있습니다.

[ deletia ]

당신은 READ COMMITTED 격리 수준 또는 locking read 하나를 사용, 데이터베이스의 "신선한"상태를보고 싶다면 : 당신은 톰캣의 기본 트랜잭션 격리 수준을 설정할 수 있습니다

SELECT * FROM t LOCK IN SHARE MODE; 

via its [email protected] attribute.

1

연결 풀은 특별히 캐싱하지 않는 한 데이터 캐싱과 아무 관련이 없습니다. 데이터 액세스를위한 연결 풀을 사용하면 과도한 연결 (예 : 너무 많은 동시 연결로 데이터베이스에 연결)을 방지하고 한 번 열린 연결을 재사용 할 수 있습니다 (일반적으로 연결을 설정하는 것은 비용이 높기 때문에 다시 활용됩니다) . 데이터베이스의 다음 고비용 작업은 실행 계획을 결정하는 것이므로 명령문 자체 (PreparedStatement 등)를 캐싱해야합니다. (실제 결과 캐싱과 무관합니다.)

캐싱 된 데이터가 실제로 mysql에서 유래했는지 또는 애플리케이션 수준에서 캐싱 중인지 분석 했습니까?

insert & update 트랜잭션이 실제로 커밋되었는지 확인하십시오. 그렇지 않으면 분명히 변경 사항이 적용되지 않으며 캐시 된 것처럼 보입니다.

+0

'insert'와'update'는 실제로 커밋됩니다. 이러한 트랜잭션 중 하나 후에 mysql db가 변경되고 동일한 쿼리가 mysql 워크 벤치 또는 webapp를 통해 쿼리를 수행하는 경우 종속적으로 다른 결과를 제공합니다. – Sefran2

+0

query_cache_size가 0이고 query_cache_type이 ON입니다. – Sefran2

1

RESET QUERY CACHE은 쿼리 캐시 만 지 웁니다.

FLUSH TABLES은 모든 테이블을 닫고 (쓰기되지 않은 데이터를 플러시 한 후) 은 쿼리 캐시를 지 웁니다.

캐시를 지우는 데 문제가 생길 수 없습니다. 모두 수행하면 후속 쿼리가 실제로 테이블에서 데이터를 가져 오게됩니다 (이러한 결과가 다시 캐싱 될 때까지).

쿼리 캐시는 오래된 데이터를 절대 표시하지 않습니다.캐시에서 조회로 참조 된 테이블에 커밋 된 쓰기는 캐시에서 해당 조회를 제거합니다. 오래된 데이터가 표시되면 다른 외부 메커니즘이 작동해야합니다. 예를 들어, 많은 ORM은 어떤 단계에서 일부 행 캐싱을 수행하며 이러한 메커니즘이 손상 될 수 있으며 의도 한대로 정확하게 사용하지 않으면 예기치 않은 결과가 발생할 수 있습니다.

어쨌든 query_cache_size = 0 또는 query_cache_type = OFF (또는 0)이면 쿼리 캐시가 비활성화됩니다.