Advance Caching Techniques Keen Haynes MKAD SCCFUG Winter 2002 Conference
Introduction What is caching? Why is it important to me? What can I cache? How do I leverage caching
Introduction (cont.) Template Cache Trusted Cache Database Connection Cache or Pooling Query Caching
Template Cache Cache the HTML generated by a template Cache for a specified period Caching can be client-side, server-side or both
Speeds up page rendering when dynamic content does not have to be retrieved each time a user accesses the page. To accomplish this, cfcache creates temporary files that contain the static HTML returned from a ColdFusion page.
(cont.) <cfcache action = "cache" or "flush" or "clientCache" or "optimal" username = "username" password = "password" protocol = "protocol name" timeout = “timeout date-time" directory = "directory name for map file" cacheDirectory =“directory name for cached pages" expireURL = "wildcarded URL reference" port = "port-number">
(cont.) Client-side caching <CFCACHE ACTION=“CLIENTCACHE” Server-side caching <CFCACHE ACTION=“CACHE” Optimal – combination of client & server <CFCACHE ACTION=“OPTIMAL” Refresh a cached page <CFCACHE ACTION=“FLUSH”
(cont.) <CFCACHE ACTION=“CACHE” TIMEOUT=“#DateAdd(“h”, “-4”, Now())#”> <CFCACHE ACTION=“FLUSH” EXPIREURL=“Customer.cfm?*”
Trusted Cache When checked, any requested files found to currently reside in the template cache will not be inspected for potential updates – recommended for sites that do not update during the life of the server.
Trusted Cache (cont.) Refreshing the template cache –Uncheck the 'Trusted Cache' option in the ColdFusion Administrator. –Click Apply. –Check the "Trusted Cache" option. –Click Apply.
Caching and CF Admin
Database Connection Caching If "Maintain Database Connections" is enabled for a data source, CF keeps the connection open after its first connection to the database. It does not log out of the database after this first connection. Will create a new connection if a request is using a data source connection that is already opened, and another request is received The connection pool can increase up to the setting for simultaneous connections limit which is set for each data source.
Database Connection Caching (cont.)
Caching and database queries What does ColdFusion do when it sees a query? Cachedwithin Cachedafter
Caching and database queries (cont) What does ColdFusion do when it sees a query? –Passes SQL content to appropriate driver (handled by a thread) –Waits for results to return before processing rest of tag –Will use existing instance of driver if data source already in use –Will cache connection information if “Maintain Database Connections” is selected
Caching and database queries (cont) <CFQUERY Name=“States” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT state_name FROM tbl_state CACHEDWITHIN (TIMESPAN) – caches the query results for a specified time CACHEDAFTER (DATE) – caches the query based on a particular date and time
Caching and database queries (cont) <CFQUERY Name=“us_states” DATASOURCE=“States” SELECT * FROM us_states ORDER BY State
Caching and database queries (cont) <CFQUERY Name=“us_states” DATASOURCE=“States” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT * FROM us_states ORDER BY State
Caching and database queries (cont) Points to remember: Queries are cached on a server-wide basis Documentation states query must use same SQL statement, data source, query name, user name, password, and DBTYPE (I did not find this to be true for query name ) SQL statements must be exactly the same – this includes even tabbing
Caching and database queries (cont) <CFQUERY Name=“States” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT state_name FROM tbl_state IS NOT THE SAME QUERY AS <CFQUERY Name=“States” DATASOURCE=“test2” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT state_name FROM tbl_state
Caching and database queries (cont) <CFQUERY Name=“States” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT state_name FROM tbl_state IS NOT THE SAME QUERY AS <CFQUERY Name=“States” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT state_name FROM tbl_state
Caching and database queries (cont) <cfquery name="us_states" datasource="States" CACHEDWITHIN=#CreateTimeSpan(0,1,0,0)#> SELECT * (Note: tabbing) FROM us_states ORDER BY State
Caching and database queries (cont) More points to remember: Queries containing dynamic values will result in an instance of each record setting being cached Max limit of 100 cached queries was removed with CF4.5 Cached queries will not reflect changes to the database until the cache interval has expired.
Caching and database queries (cont) Forcing an update of cached queries This can be accomplished by following queries that effect changes with a CFQUERY that contains a negative CACHEDWITHIN value <CFQUERY Name=“Customers” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,0,0,-1)#> SELECT customer_name FROM tbl_customer
Caching and database queries (cont) UPDATE <CFQUERY Name=“Customers” DATASOURCE=“test” CACHEDWITHIN=#CreateTimeSpan(0,0,0,-1)#> SELECT customer_name FROM tbl_customer
Advance Security Caching and CF Admin Security Server Policy Store Cache caches Advanced security information. By default, it is notified of administrative changes to the policy store once every minute. Using this cache provides the most noticeable performance improvements with Advanced security. Security Server Authorization Cache caches each unique isAuthorized call. ColdFusion Server Cache caches isAuthorized and isProtected requests.
Advance Security Caching and CF Admin (cont.)
The CFML Language Reference ommits[sic] a new ColdFusion Server 5 tag, cfobjectcache. It clears, or flushes, the entire query cache. The action attribute must be set to clear. No other values are supported. ML_Reference/Tags78.jsp# http://livedocs.macromedia.com/cf50docs/CF ML_Reference/Tags78.jsp#
Summary Things to consider –Overhead –Need for “current” information Identify candidates for caching – both long running and frequently called queries and templates Testing to verify expected results
?