1厉颤、數(shù)據(jù)庫時間存取問題
? ? 錯誤
? ?如果向數(shù)據(jù)庫中存入格式不正確的時間數(shù)據(jù)時候妒挎,mysql就會自動將時間修改為0000-00-00 00:00:00异逐。 從數(shù)據(jù)庫中獲取這條數(shù)據(jù)的時候就會報錯
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 1 to TIMESTAMP;
????????對外顯示500內(nèi)部服務(wù)器異常耕肩。
? ? ?原因
????????原因是MYSQL中的timestamp支持1970到2038這個范圍內(nèi)的時間汉嗽,而格式錯誤或者越界的時間將會自動歸為0000-00-00 00:00:00欲逃;所以數(shù)據(jù)庫將錯誤數(shù)據(jù)自動存為這個格式是沒有問題的。而真正的原因是JDBC最小支持的時間是0001-01-01 00:00:00’?饼暑,而‘0000-00-00 00:00:00’?在MySQL中也只是作為一個特殊值存在的稳析,自然轉(zhuǎn)換時就會報錯洗做。
? ? 解決方案
? ? ? ? ? ? 1、在創(chuàng)建表的時候彰居,在使用到時間的那一個字段設(shè)置默認時間:
? ??????`CREATE_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
? ? ? ? ? ? ?2诚纸、在JDBC的url上加上zeroDateTimeBehavior屬性
? ? ? ? 例如application.yml:? ? ??
jdbc:mysql://localhost:3306/pe?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull?
這樣JDBC轉(zhuǎn)換時就會將零值轉(zhuǎn)成‘0001-01-01 00:00:00’
2、JSON.toJSONString()方法的注意點
JSON.toJSONString()是可以將對象轉(zhuǎn)為一個字符串陈惰。
1畦徘、如果對象為一個null,這時轉(zhuǎn)化出來的字符串為"null",字符長度為4奴潘;
2旧烧、如果對象為一個空列表,這時轉(zhuǎn)化出來的字符串為"[]",字符長度為2画髓;
JSON.parseArray(,);是可以將一個字符串轉(zhuǎn)化為規(guī)定的對象掘剪。
無論是"null"還是"[]",解析出來的對象都是null,需要注意奈虾。
3夺谁、緩存問題? ? ? ? ? ? ?
為了防止緩存穿透,當數(shù)據(jù)庫中查到的是空集合時肉微,仍然要將其存放到緩存中匾鸥。
空集合和null還是有區(qū)別的,如果讀緩存后解析出來的集合是null碉纳,說明之前沒有進行過寫緩存操作勿负,這是第一次進行查詢,需要先去查詢數(shù)據(jù)庫劳曹;如果讀緩存后解析出來的集合是空集合奴愉,說明之前寫過緩存,而且是防止緩存穿透的時候?qū)懭氲奶酰@時無需查詢數(shù)據(jù)庫锭硼,直接將緩存讀取的空集合返回。