曾幾何時,接到公司命令,要求負責的產品兼容國產數據庫和操作系統,估計是中美貿易戰波及的,吭吭唧唧做完了,做個總結吧,通過這個項目,感覺國產數據庫和操作系統也不差,雖然底層是oracle和linux,但是至少做到了無縫兼容,估計也是一種技術策略,既做到了國產化,也大大降低了使用者的學習成本,大規模推廣做了基礎。另外感覺達夢的數據庫遷移工具用起來挺爽,可視化傻瓜式做的比較好,就是系統穩定性和性能還需要提高,社區和網上資料太少,需要加強。言歸正傳,講講碰到的幾個坑及解決方法吧。
一、達夢數據庫
達夢數據庫底層是oracle數據庫,如果本身已經是oracle數據庫的話,語法基本相同,只是程序需要改造點,需要引入達夢jdbc驅動,如果使用SYSDBA的話,程序模型層需要加模式名。如下改造:
1.先在代碼src目錄下新建一個lib目錄,將DmDialect-for-hibernate5.0.jar,DmJdbcDriver18.jar拷入該目錄
2.應用項目中pom.xml中增加上面的兩個依賴包
|
3.配置文件配置數據庫鏈接
|
4.如果用戶使用SYSDBA,模型層需要加模式名
5.調用存儲過程,封裝了個通用方法
/** * DM數據庫 調用存儲過程公共方法 * * @param param 調用存儲過程的參數 * @param procedureName 對應數據庫的存儲過程名 * @param dataSource auth,cdr的連接 * @return */ public static List getDmOutReturnList(Map<String, String> param, String procedureName, DataSource dataSource) { ResultSet rs = null; List list = new ArrayList(); //拼接入參 String sqlStr = getSqlStr(param, procedureName); try { //創建數據庫連接 Connection conn = dataSource.getConnection(); //創建連接狀態 Statement state = conn.createStatement(); //執行sql CallableStatement cstmt = conn.prepareCall(sqlStr); for (Map.Entry<String, String> entry : param.entrySet()) { cstmt.setString(entry.getKey(), entry.getValue()); } cstmt.registerOutParameter(param.size() + 1, OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(param.size() + 1); list = convertList(rs); //關閉ResultSet rs.close(); //關閉連接狀態 state.close(); //釋放(歸還)連接 conn.close(); return list; } catch (Exception e) { LOGGER.error("調用存儲過程報錯:{}", procedureName, e); } return list; } /** * ResultSet 轉 List * * @param rs ResultSet * @return List */ private static List convertList(ResultSet rs) { List list = new ArrayList(); try { ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); while (rs.next()) { Map rowData = new HashMap(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; } catch (Exception e) { LOGGER.error("轉換出錯:{}", e.getMessage()); } return list; } /** * 拼接入參 * * @param param 存儲入參 * @param procedureName 存儲名 * @return sql */ private static String getSqlStr(Map<String, String> param, String procedureName) { List list = new ArrayList(); for (int i = 0; i < param.size() + 1; i++) { list.add("?"); } return "call " + procedureName + "(" + StringUtils.join(list.toArray(), ",") + ")"; } |
二、使用操作系統
本次是平生第一次使用linux操作系統,在同事的幫助下入了門,然後一頓百度,也基本能完成一般的項目部署工作,收穫挺多,也對Linux起了興趣,年底賺錢了準備買個電腦,明年的學習計劃就有Linux了,畢竟往後玩大數據,這是必備技能。關於國產操作系統這次工作也沒過多說的,待會直接貼網址。就一個坑,部署上去的jar包配置文件放到項目外會出現失效問題,後來把它放到裏面了就好了。
參考資料:達夢:
https://blog.csdn.net/wllpeter/article/details/79486426
https://blog.csdn.net/jay_1989/article/details/51075200
linux:
https://www.cnblogs.com/wanwen/p/7495578.html
https://www.runoob.com/linux/linux-comm-chmod.html
https://blog.csdn.net/bingxuesiyang/article/details/88417465