1. 程式人生 > >2013年工作中遇到的20個問題:221-240

2013年工作中遇到的20個問題:221-240

221.Eclipse下的Tomcat部署總是舊的檔案。
比如今天是9號,釋出的檔案卻一直是8號的。
最終,刪除Tomcat重新部署還是不行。
解決辦法是:重啟Eclipse後,第2天來重新發布就好了。

222.單元測試搞混了。
以前專門寫了針對SpringMVC+Spring+Mybatis架構的單元測試基礎類。
現在有個就專案MVC框架用的是Struts2,這時Service還可以用以前的那個,而測試Action就不行了。
所以,需要重新學習和實踐單元測試Struts2.

223.Apache POI獲取Excel單元格的行數和列數、Sheet個數。

int coloumNum=sheet.getRow(0).getPhysicalNumberOfCells();//獲得總列數
 int rowNum=sheet.getLastRowNum();//獲得總行數
  int sheetNum = templateWorkbook.getNumberOfSheets();//sheet的個數
 



  一段時間不弄POI,API好多都忘記了。
 
 
224.SQLServer遷移到MySQL。
SQLServer->Access->MySQL
這種方式存在的問題:資料庫表名大小寫存在問題,欄位的型別不夠準確,比如varchar轉成了longtext。
需要手動修改不少資料庫設計。

225.Hibernate多資料來源切換。
public Session getSessionByProjectId(int projectId);
不同的專案返回不同的資料庫Session。
其它地方都是好的,今天實現新功能的時候發現Session切換不成功。
後來,發現是事務引起的問題。
@Transactional(value = "project", readOnly = false, propagation = Propagation.REQUIRED)
public void method();

method內部有多個dao,有操作固定資料庫db的dao,有根據projectId切換session的dao。
後來,為了尋找錯誤原因,僅僅寫了個只包含getSessionByProjectId一個方法呼叫的測試方法,通過了,
進而推斷出是事務的問題。

現在,是分2個方法來實現事務,雖然不是最好的,卻是最方便的。

public void method(){
 method1();
 method2();
} 

@Transactional(value = "project", readOnly = false, propagation = Propagation.REQUIRED)
 method1();
 
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 method2();
 



226.重寫優於重構。
專案中有個需求是根據一個具有父子關係的表結構構造一個Tree,由於原來的程式碼看起來很難懂,
加上最近需求發生大量變更,在原有程式碼基礎上不斷修改的過程中,總是有點小問題。
遞迴,迴圈,判斷很混亂。
最後,決定重寫,1天時間寫好並測試通過。

227.更新某個欄位為null的行。
UPDATE TSide set tags="mTags" where tags is null;
在MySQL Front的SQL編輯器中中,null和NULL都給的是“關鍵字”顏色。
應該用小寫的null。

228.Linux殺死Java程序。
Linux命令:killall用於殺死指定名字的程序(kill processes by name)。
我們可以使用kill命令殺死指定程序PID的程序,如果要找到我們需要殺死的程序,我們還需要在之前使用ps等命令再配合grep來查詢程序,
而killall把這兩個過程合二為一,這真是一個太好用的命令了。

同事Linux機器上的Eclipse卡死了,啥也不能幹,只能強制刪除。
我以前只知道用kill,每次還必須先知道程序id,現在有了更好的方法。
在幫助別人的過程中,也學習到了新的東東。

229.Tomcat部署後啟動,經常提示找不到某個類,實際上這個類明明存在,只能刪除然後重新發布專案。
目前不知道根本原因是啥。

230.濫用Hibernate。
根據id獲取公司資訊,咋搞這麼複雜呢?
改進後代碼:

public TcompanyInfo getCompanyInfo(int id) {
  TcompanyInfo info = super.get(id);
  return info;
 } 


原始程式碼:
 

public List<CompanyBean> getCompanyInfoByID(int id) {
        List<CompanyBean> list = new ArrayList<CompanyBean>();
        try {
            Session session = getCurrentSession();
            String querySql = "";
   //Windows切換到Linux,表名區分大小寫後,SQL語句報語法錯誤
            querySql = String.format(
                    "Select * from TComapnyInfo where cID = %d ", id);
            Query query = session.createSQLQuery(querySql);
            List<Object[]> objList = query.list(); 

            int size = objList.size();
            for (int i = 0; i < size; i++) {
   //這種程式碼太難維護了
                CompanyBean cb = new CompanyBean();
                cb.setCompanyID(Integer.parseInt(objList.get(i)[0].toString()));
                cb.setCompanyName(handleNullObject(objList.get(i)[1]));
                cb.setLogoURL(handleNullObject(objList.get(i)[2]));
                list.add(cb);
            } 

        } catch (HibernateException e) {
            e.printStackTrace();
        }
        return list;
    }
 



231.一個奇怪的資料庫問題。

// String oldSql =
   // "select ct.id as templateId,ct.chartTemplate,ct.description,ct.templateCode,ta.id as authId,ta.auth,ta.projectId
 from chartTemplate ct left outer join templateAuth ta on ct.templateCode = ta.templateCode "
   // + " and ta.projectId=:projectId";
 String sql = "select ct.id ,ct.chartTemplate,ct.description,ct.templateCode,ta.id as authId,ta.auth,ta.projectId 
from chartTemplate ct left outer join templateAuth ta on ct.templateCode = ta.templateCode "
     + " and ta.projectId=:projectId";
   
 Session s = super.getCurrentSession(); 

 Query query = s.createSQLQuery(sql);
 query.setParameter("projectId", tvo.getProjectId());
 List<Object[]> list = query.list();
   


 使用oldSql在SQLServer中,沒有問題,在MySQL中報異常。
九月 26, 2013 2:34:47 下午 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: id; Column 'id' not found.
九月 26, 2013 2:34:47 下午 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: S0022
九月 26, 2013 2:34:47 下午 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Column 'id' not found. 

把“select ct.id as templateId”改為"select ct.id"就可以了。

232. Hibernate專案的資料庫遷移問題。
不能在MySQL下執行,原來是在SQLServer下的。

select projectName,
  cast(DATEPART(year, visitTime) as varchar) +'-'+ cast(DATEPART(month, visitTime) as varchar)as month
 from visitLog
 



 用了Hibernate卻不能順利遷移到MySQL,對Hibernate真是一個侮辱啊!
 

233.日期轉換功能通過SQL指令碼還是通過寫程式來實現?
 cast(DATEPART(year, visitTime) as varchar) +'-'+ cast(DATEPART(month, visitTime) as varchar
 象這種功能,寫成java函式多好?
 "2011-08-11 11:22:43"轉換成“2011-08”寫成java函式多好啊!!!
 
234.資料庫表名硬編碼。
Windows下表名是不區分大小寫的,而Linux下是區分的。
因此,在SQL中表名沒有嚴格按照大小寫,導致遷移出錯。

表名不區分大小寫的根本原因:Windows的檔案是不支援大小寫區分的,而Linux支援。

235.CSDN文章分類。
“小雷網”分類下有10篇文章,我現在不想要這個分類了。
原來的做法是,編輯每一篇文章,取消該文章的“小雷網”分類。
好的做法是:直接刪除“小雷網”分類,系統會自動把所有該分類下的文章移除該分類。
(級聯操作)

236.定位問題的方法。
Hibernate報了一個錯誤Could not parse mapping document from input stream。
下面是列印的資訊:
INFO: Mapping class: * -> TProjectChart
九月 27, 2013 11:28:40 上午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: * -> TProjectKeyword
九月 27, 2013 11:28:40 上午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: * -> treport
九月 27, 2013 11:28:40 上午 org.hibernate.util.XMLHelper$ErrorLogger error
SEVERE: Error parsing XML: XML InputStream(5) 元素內容必須由格式正確的字元資料或標記組成。
經過分析,應該是Hibernate配置檔案出錯導致的。
看列印資訊,應該是treport.hbm.xml這個配置檔案附近的。
果然,是treport的下一個配置檔案tside.hbm.xml存在語法錯誤。

之所以沒有報錯,是因為“語法錯誤是因為有版本衝突導致的”
<<mine r27
xml校驗器,沒有給出錯誤提示。

237.PowerDesigner 主鍵ID不能複用問題。
當設定主鍵後,主鍵ID不能在其他表中引用。
將在表設計的空白處右擊,在選單中選擇"Model Options”,點掉Unique Code 前的複選框!
上大學學習PowerDesigner的時候遇到這個問題了,今天新人同事在群裡問這個,我就順便答覆了。

238.分頁功能維護一份sql。
 List  list();
 Integer count();
 2個函式最好維護一份sql程式碼。
 這2個分頁的子功能,大部分程式碼是一致的,儘可能只維護一份相同的sql,如構造通用的commonSql。

239.字串拼接的“引號”問題。

Query query = session.createQuery(hql);
   if (projectName != null && !projectName.trim().equals("")) {
    query.setParameter("projectName", "%'" + projectName + "'%");
   }
   



正確的寫法是 query.setParameter("projectName", "%" + projectName + "%");
不需要那個“畫蛇添足的引號”!!

查詢count的時候也不需要設定分頁引數。
query.setFirstResult((pageNo – 1) * pageSize);
query.setMaxResults(pageSize);
這也是“複製貼上”引起的問題。
偷懶是可以的,“複製貼上”這種偷懶的方法就太差勁了,還是要多動動腦子。

240.JS獲取頁面某個區域的表單引數。
//獲取某一個div下的所有引數

function buildUpSearchParam(divId){
 var param = {};
 param["currentPage"] = 1;
 var paramInputs = $(":text" , $("#" + divId));
 for(var i=0;i<paramInputs.length;i++){
  param[paramInputs[i].id] = paramInputs[i].value;
 }
 return param;
 }
   



<div class="Trend_Rank" //id="paramDiv",id不應該放在這裡,這個div包含了2個table>
 <table width="50%" id="paramDiv" >
 </table>
 
 //這個table,表單元件自動插入了分頁的按鈕等,這樣會多了<input type="button" value="goTo">。
 導致向後端傳送引數的時候會多傳送1個project.goTO引數,project這個物件卻沒有這個屬性,
 出現OGNL沒有這個屬性的異常。
 <table>
 
 </table>
 
</table>

相關閱讀