1. 程式人生 > >jfinalQ開發教程06-qiao-util.jar:日誌和快取

jfinalQ開發教程06-qiao-util.jar:日誌和快取

cachedribbble.jpg


日誌

常見日誌元件

java中常用的日誌有自帶的logging,log4j,logback,slf4j等,

jfinalQ中使用slf4j+logback,上面幾種日誌元件的對比詳見:http://www.importnew.com/7450.html

slf4j準確的來說是一個日誌介面,而不是日誌元件,可以很方便的接入logging,logback,log4j。


slf4j+logback

上面說到slf4j只是日誌介面,具體的日誌元件採用logback,需要引入這些jar:

slf4j-api-1.7.7.jar

logback-classic-1.1.2.jar

logback-core-1.1.2.jar

還需要一個配置檔案logback.xml:

<configuration>
	<!-- 定義變數 -->
	<property name="pattern" value="%date{yyyy-MM-dd HH:mm:ss} %-5level %logger{0} %n%msg%n" />
	<property name="filepath" value="/home/bae/log/bae.%d{yyyy-MM-dd}.log" />

	<!-- 列印到檔案,每天一個,儲存30天的 -->
	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${filepath}</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${pattern}</pattern>
		</encoder>
	</appender>
	
	<!-- 列印到控制檯 -->
	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${pattern}</pattern>
		</encoder>
	</appender>

	<root level="error">
		<appender-ref ref="file"/>
		<appender-ref ref="stdout"/>
	</root>
</configuration>

以上是常用的配置檔案,包括日誌格式,輸出到控制檯和輸出到檔案。


logger

程式碼中使用的時候只需要引入slf4j的logger:

private static final Logger logger = LoggerFactory.getLogger(LoginService.class);

然後這個logger介面會去獲取對應的日誌實現,例如logback,log4j等。

日誌的型別也是常見的幾種:error,warn,info,debug。


快取

常見快取元件

java中常見的快取元件有:memcached,ehcache,redis等,

jfinalQ中採用了小巧的echcache,其實如果條件允許,還是使用redis比較好~


ehcache

ehcache使用的時候只需要引入ehcache-2.9.0.jar和上面說的slf4j日誌即可,

還需要一個ehcache.xml的配置檔案,如下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="false" monitoring="autodetect"
         dynamicConfig="true">
         
    <diskStore path="java.io.tmpdir"/>
    
    <defaultCache
           maxEntriesLocalHeap="1000"
           eternal="false"
           overflowToDisk="true"
           timeToLiveSeconds="1800">
    </defaultCache>

	<!-- 
		must:
			name 					: name
			maxEntriesLocalHeap 	: 記憶體物件數,0無限制
			maxEntriesLocalDisk 	: 硬碟物件數,0無限制
		choice:
			overflowToDisk			: 記憶體滿時是否存到硬碟上
			diskSpoolBufferSizeMB	: 硬碟快取空間
			timeToIdleSeconds		: 失效前空閒時間,86400為1天
			timeToLiveSeconds		: 失效前存活時間,86400為1天
	-->
    <cache name="cache"
           eternal="false"
           maxEntriesLocalHeap="0"
           maxEntriesLocalDisk="0"
           overflowToDisk="true"
           diskSpoolBufferSizeMB="200"
           timeToLiveSeconds="86400"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off"
            />
</ehcache>

這裡只配置了一個快取,通常應該配置多個快取。


QCacheUtil

qiao-util.jar中對ehcache的相關操作做了封裝,方便使用,詳見:com.uikoo9.util.function.QCacheUtil,

/**
 * 快取工具類<br>
 * 1.獲得一個ehcache<br>
 * 2.關閉ehcache manager<br>
 * 3.向預設ehcache中存入一個物件<br>
 * 4.從預設ehcache中讀取一個物件<br>
 * 5.從預設ehcache中移除一個物件<br>
 * @author qiaowenbin
 * @version 0.0.1.20141109
 * @history
 * 	0.0.1.20141109
 */
public class QCacheUtil {}


資料快取

對於一些資料庫中變動少的資料可以放到快取中,加快每次訪問的速度,而不是每次都去資料庫中取,

一般的做法是在Model新增一個findByCache方法:

        /**
	 * find all by cache
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<BillAccountModel> findAllByCache(){
		List<BillAccountModel> accounts = null;
		
		Object value = QCacheUtil.getFromEHCache("accounts");
		if(value == null){
			accounts = BillAccountModel.dao.findAll();
			QCacheUtil.putToEHCache("accounts", accounts);
		}else{
			accounts = (List<BillAccountModel>) value;
		}
		
		return accounts;
	}

需要注意的是,添加了這個方法的Model在每次新增修改刪除的時候都需要重新獲取資料並放入快取。


jfinalQ2.0

官網:http://uikoo9.com/jfinalQ

原始碼:https://github.com/uikoo9/jfinalQ


更多精彩內容:http://uikoo9.com/


求打賞(長按圖片即可識別)~
微信 捐助列表:http://uikoo9.com/donate/