2013年工做中遇到的20個問題:181-200

每一個人在工做中遇到的問題,不少都是相似的。瞭解別人遇到的問題,本身遇到的時候就能夠很快地解決它。 不少人不屑於這種「細節問題」,但我想說,掌握這些細節問題一次可能只能幫你節省1s的時間,可是這個細節使用頻率很是高, 1年能夠節省很多時間的。若是按1秒*20次*300天=100分鐘。css

181.MySQL數據庫是否區分大小寫。html

方法1:設置字符集校對collate 經過查詢資料發現須要設置collate(校對) 。 collate規則:java

*_bin: binary case sensitive collation,也就是說是區分大小寫的 *_cs: case sensitive collation,區分大小寫 *_ci: case insensitive collation,不區分大小寫
方法2:設置字段的字符集校對 mysql

1.能夠將查詢條件用binary()括起來。 好比: select * from TableA where columnA like binary('aaa'); 算法

2.能夠修改該字段的collation 爲 binary spring

好比: sql

ALTER TABLE User MODIFY COLUMN name VARCHAR(255) COLLATE utf8_general_ci DEFAULT NULL; 數據庫

方法3:使用MySQL的lowwer函數和Java的toLowerCase方法。 apache

Java變量myname = myname.toLowerCase() SQL語句 select * from user where lower(name) like '%myname%'; 瀏覽器

參考資料:http://my.oschina.net/xiangtao/blog/33983 http://blog.csdn.net/lawmansoft/article/details/7217712

182.整數相加的溢出問題。 我原本想寫一個通用求和方法sum(int… array); 想到可能會發生溢出,因此我須要判斷是否溢出。

參考資料:http://blog.csdn.net/ljg888/article/details/8035276

方法1 19./*Determine whether arguments can be added without overflow */ 20.int taddOK(int x, int y){ 21. int sum = x + y; 22. int negOverflow = x < 0 && y < 0 && sum >= 0; 23. int posOverflow = x >= 0 && y >= 0 && sum <= 0; 24. 25. return !negOverflow && !posOverflow; 26.} 

方法2 Goolge-Guava庫/guava-libraries/guava/src/com/google/common/math/IntMath.java有以下方法

public static int checkedAdd(int a, int b) { long result = (long) a + b; checkNoOverflow(result == (int) result); return (int) result; }
用long保存int相加的臨時結果,再強制轉換爲int,判斷2個int是否相等。

183.jQuery在項目中最好只使用1個版本的,好比1.9。 jQueryUI版本要一致,不要搞2套主題,麻煩死了。 使用jQueryUI時,最好把全部相關的js、css、image都放進項目中。 若是每使用1個組件,就增長相關資源,容易出現問題。維護麻煩。
184.浮點數等符合類型進行運算。 Float one; Float two;
if(one != null && two != null){ result = one – two; }
在調試這個問題的過程當中,遇到了另外2個問題。
A.服務器端安裝了2個安全補丁,致使我這邊的Eclipse不能遠程調試程序了,端口沒法訪問。巨坑啊!
B.Eclipse定位異常信息的具體位置。
Exception in thread "main" java.lang.NullPointerException at com.miaozhen.cms.controller.CampaignGroupController.ttt(CampaignGroupController.java:254) at com.miaozhen.cms.controller.CampaignGroupController.main(CampaignGroupController.java:248)

應該是上面的「ttt」的位置,這些細節很重要。
185.使用jQueryUI 對話框組件的時候,div最好設置爲隱藏。 要否則可能會出現瀏覽器兼容性問題。
<div id="dialog-confirm" title="Delete the campaign group?" style="display:none;">   <p>    <span class="ui-icon ui-icon-alert"     style="float: left; margin: 0 7px 20px 0;"></span> Are you sure?   </p> </div>
186.jQueryUI datepicker日曆組件。 爲了給該組件增長1個「clear」按鈕,咱們修改close的文本爲clear,而後給它增長事件。 遇到的問題是,最小值和最大值 範圍 選擇時,遇到了bug,很差解決。
換成My97Datepicker.
仍是專業的更好啊!!!
187.JUnit單元測試的參數順序問題。 void junit.framework.Assert.assertEquals(String expected, String actual) Asserts that two Strings are equal.

第1個參數是「期待的」,第2個參數纔是 實際的值。 很長時間以來,我都搞錯了順序,今天才發現。

188.Spring 讀取屬性配置文件。 <!– Properties文件讀取配置,*.properties –> < context:property-placeholder location="classpath*:*.properties" />
老是提示"${jdbc.url}"沒法解析。
不起做用的配置 <context:property-placeholder location="classpath:*.properties" />

<bean id="propertyConfigurer"   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   <property name="locations">    <list>     <value>classpath:*.properties</value>    </list>   </property> </bean>
正確的方法,把上面的2種的「classpath:*.properties」改成"classpath*:*.properties"就能夠了。
說明我弄的是maven項目,分紅src/main/java和src/main/resource 2個Source Folder。
個人理解是:2個Source Folder都在classpath下,classpath*能夠包含2個,這樣就能找到 src/main/resource路徑下的jdbc.properties等屬性配置文件了 classpath*相關參考:http://blog.csdn.net/kkdelta/article/details/5507799
189.多個產品同步用戶的問題。 User有2個標識字段 isChanged是否已經變動 updateTime,更新時間
增量同步:同步某個時間點後變動的。 全量同步:若是指「同步全部變動的」,是有問題的。一個產品同步user後,isChanged已經被修改了。 其它產品就不能同步了。
最終的定義:不要isChanged字段,只保留updateTime
其它產品同步用戶時,帶1個時間戳,或者帶1個特殊標誌,則同步全部的。 (再也不存在用戶是否變動這一說法)

190.數據同步接口的主動同步與被動同步。

主動同步:程序定時,發送URL請求,同步另一個系統的數據。 被動同步:擁有數據的系統,當數據發生了變化時,回調須要同步數據的項目的接口。

191.Commons Fileupload組件能夠用來方便地實現文件上傳。 功能還挺多的。 http://commons.apache.org/proper/commons-fileupload/
今天才知道,SpringMVC上傳文件,底層使用的是commons-fileupload。 SpringMVC也會偷懶,避免了重複造輪子。

192.英語詞彙要統一。 StartTime和BeginTime都表示開始,StopTime和EndTime均可以表示結束時間。
要麼都用StartTime和StopTime,要麼都用BeginTime和EndTime。 相似的還有增長,使用Add或者Create,修改Modify或者Update。

193.表格的排序和圖形標誌要一致。 表格初始化的時候,結果集是按照id降序排列的,而圖形標誌卻爲非排序狀態。

194.將My97Datepicker接收的日期是'2013-08-22'這種格式,後臺須要轉化爲java.util.Date。 一不當心,日期的格式設置成了「YYYY-MM-HH」。

public static Date parseDate(String date) {   if(StringUtils.isEmpty(date)){    return null;   }
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");   Date d = null;   try {    d = format.parse(date);   } catch (ParseException e) {    e.printStackTrace();   }   return d; }

結論:從新實現一次很基本的功能,也可能出錯。 使用之前的代碼,通過檢驗的代碼仍是比較靠譜的。 單元測試仍然頗有必要。

195.筆記本的Win7系統大半年沒有更新了,比較卡,重裝了系統。 遇到幾個問題,網卡驅動沒有安裝,只好使用之前下載的惠普驅動。 發現不起做用。

最終:在惠普官網上,下載了好幾個驅動,某一個成功了。

備份驅動、資料、數據庫數據 都很必要。

196.更改eclipse中maven默認本地庫repository的位置。 更換系統前,我把Maven的配置 .m2文件夾備份到了非系統盤目錄, 如今要把Eclipse中Maven的位置修改成如今的位置,避免之後換系統再次備份, 避免如今從新下載庫和影響到如今的項目。

Perferences-Maven-UserSetting,先設置maven的settings.xml 的位置,而後reindex。(首先修改settings.xml的文件)

<settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository> E:MavenRepository </localRepository> < /settings>

參考資料:http://blog.sina.com.cn/s/blog_52ef937201019waa.html

http://blog.chinaunix.net/uid-714081-id-2678568.html

197.Mybatis SQL語句優化,使用子查詢代替聯表。 <!– 性能很低,已經廢棄 –> <!– 超級管理員 沒有權限限制,普通用戶有2種狀況 –> < select id="list2" parameterType="campaign" resultType="campaign">   select distinct mc.*,mp.startTime,mp.endTime from st_monitor_campaign   mc   <if test="userId != null">,st_monitor_campaign_permission mcp   </if>   ,st_media_plan mp   where … <!– 用戶有權限,或者是本身或子用戶建立的 –>   < if test="userId != null">    and (    ( mc.MCampaignId = mcp.MCampaignId    and permission = 1    and    userId =    #{userId} ) or (mc.CreatedUserId in (${userIdList}) ))   </if>
  (3種權限狀況,只有1種狀況須要鏈接st_monitor_campaign_permission表) 優化後(mc.CreatedUserId in (${userIdList})這個地方避免了鏈接permission表,並且是全表掃描)   使用mysql explain命令查看sql語句的各類詳細細節,對sql優化頗有幫助
select distinct mc.*,mp.startTime,mp.endTime from st_monitor_campaign   mc,st_media_plan mp   where … <!– 用戶有權限,或者是本身或子用戶建立的 –>   < if test="userId != null">    and (    ( mc.MCampaignId in (select mcp.MCampaignId    from st_monitor_campaign_permission mcp    where permission = 1    and    userId =    #{userId}) ) or (mc.CreatedUserId in (${userIdList}) ))   </if>
從這個例子,能夠看出Mybatis的好處。sql優化比較方便,不須要從新編譯,不須要修改接口。
198.Window系統的電腦鏈接投影儀。 Win+P,快捷鍵,直接出現鏈接到投影儀 選項–僅計算機、複製、擴展、僅投影儀。 或者 在桌面->右鍵 屏幕分辨率->鏈接到投影儀->僅計算機、複製、擴展、僅投影儀。
複製 是最好的選擇,電腦和投影儀畫面徹底一致,即投影儀的界面是 電腦的「副本」。 而擴展則須要把電腦中的畫面 拖進某個地方,投影儀才能看到。具體很差描述。
建議:優先使用複製,其次纔是投影儀。

199.java -Dfile.encoding設置解決程序運行亂碼問題。 Java默認使用的是系統的編碼,好比 Win7中文系統默認就使用GBK,讀文件時默認按照GBK格式讀取。 經過設置java -Dfile.encoding,能夠按照本身定義的編碼來讀取文件。

200.慎用全局變量。 Spring中的Service,單例的。 class UserService{

@Autowired private CampaignGroupDAO campaignGroupDAO;
private List<Integer> allSonUserIds = new ArrayList<Integer>();
//得到1個用戶的全部子用戶 public List<Integer> getSonUserIds(int userId) {   List<Integer> userIds = userDAO.getSonUserIds(userId);   if(!userIds.isEmpty()){    for (Integer id : userIds) {     allSonUserIds.add(id);     getSonUserIds(id);    }   }   return allSonUserIds; } }

錯誤的寫法2 public List<Integer> getSonUserIds(int userId) {   //記錄全部的子用戶的Id   List<Integer> allSonUserIds = new ArrayList<Integer>();   List<Integer> userIds = userDAO.getSonUserIds(userId);   if(!userIds.isEmpty()){    for (Integer id : userIds) {     allSonUserIds.add(id);     getSonUserIds(id);    }   }   return allSonUserIds; } 說明:這段代碼不是我寫的啊,別噴我。o(︶︿︶)o

我的見解:使用迭代 public List<Integer> getSonUserIds(int userId) { //維護全部的 List<Integer> allList = new ArrayList<Integer>();
  //維護一個「隊列」 List<Integer> allSonUserIds = new ArrayList<Integer>();   allSonUserIds.add(userId);   allList.add(userId);
  for(Integer userId :allSonUserIds){    List list= userDAO.getSonUserIds(userId);    //修改當前隊列 allSonUserIds.addAll(list);    //刪除已經遍歷過的元素 allSonUserIds.remove(userId);
   //維護全部的用戶id    allList.addAll(list);   }
  return allList; }

使用迭代的代碼彷佛也存在這個問題,即迭代中刪除元素致使的問題, 我在「2013年工做中遇到的20個問題:1-20」第16個有描述,使用 for(Iterator iterator =p.iterator();iterator.next();){ if(){ iterator.remove(); } } 這種方式不會有問題,而for循環有問題 ###################################################### for(int index=0;index<p.size();index++){—再也不正確,由於index也發生了變化

} 。
如今的問題是for-each循環是否正確呢?? allSonUserIds.remove(userId); 這種方式刪除元素,效率也比較地。
最好仍是使用Iterator進行遍歷和刪除。
另一個問題: //維護一個「隊列」 List<Integer> allSonUserIds = new ArrayList<Integer>();
維護隊列仍是使用Queue比較好,push和pop也很合適。
和公司大牛談到這個問題,讓我想起了大二寫遍歷二叉樹算法,使用迭代而非遞歸實現時, 當時用的就是隊列。

問題故而知新!!!

原文參見:http://fansunion.cn/articles/2313

相關文章
相關標籤/搜索