兼容國產數據庫達夢和操作系統鯤鵬泰山操作系統總結

      曾幾何時,接到公司命令,要求負責的產品兼容國產數據庫和操作系統,估計是中美貿易戰波及的,吭吭唧唧做完了,做個總結吧,通過這個項目,感覺國產數據庫和操作系統也不差,雖然底層是oracle和linux,但是至少做到了無縫兼容,估計也是一種技術策略,既做到了國產化,也大大降低了使用者的學習成本,大規模推廣做了基礎。另外感覺達夢的數據庫遷移工具用起來挺爽,可視化傻瓜式做的比較好,就是系統穩定性和性能還需要提高,社區和網上資料太少,需要加強。言歸正傳,講講碰到的幾個坑及解決方法吧。

 一、達夢數據庫

      達夢數據庫底層是oracle數據庫,如果本身已經是oracle數據庫的話,語法基本相同,只是程序需要改造點,需要引入達夢jdbc驅動,如果使用SYSDBA的話,程序模型層需要加模式名。如下改造:

    1.先在代碼src目錄下新建一個lib目錄,將DmDialect-for-hibernate5.0.jar,DmJdbcDriver18.jar拷入該目錄

    2.應用項目中pom.xml中增加上面的兩個依賴包

<dependency>
  <groupId>com.dm</groupId>
  <artifactId>DmJdbcDriver18</artifactId>
  <version>1.8</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/DmJdbcDriver18.jar</systemPath>
</dependency>
<dependency>
  <groupId>com.dm</groupId>
  <artifactId>DmDialect</artifactId>
  <version>5.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/DmDialect-for-hibernate5.0.jar</systemPath>
</dependency>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

    3.配置文件配置數據庫鏈接

#DMJDBC 驅動類
spring.datasource.driverClassName=dm.jdbc.driver.DmDriver
#DMURL 連接
spring.datasource.url=jdbc:dm://127.0.0.1:5236/AUTHUSER
#DM用戶名
spring.datasource.username=SYSDBA
#DM用戶口令
spring.datasource.password=SYSDBA

##DMHibernate方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect

    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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章