主頁 > 軟體設計 > 達夢資料庫適配:DM8+SpringBoot+HiKari+MyBatis3.4.6+tk.MyBatis+PageHelper

達夢資料庫適配:DM8+SpringBoot+HiKari+MyBatis3.4.6+tk.MyBatis+PageHelper

2021-04-15 10:18:47 軟體設計

簡介:達夢資料庫適配

DM8+SpringBoot+HiKari+MyBatis3.4.6+tk.MyBatis+PageHelper

思考:

1、當使用K8、Docker容器化編排技術受到限制,當Oracle、MySql資料存盤等資料庫軟體不再向我們提供正常的服務?

2、在我們的專案工程中,若是沒有了這些核心技術提供正常的服務,如何能夠去及時地采取補救的措施,使得業務能夠平滑過渡,做到讓用戶無感知體驗?

3、是否能夠擁有自己的資料存盤解決方案,技術框架是否能夠適配,能否做到更好地兼容?

下文,小編主要以達夢-DM適配為例->常見問答Q-A的方式闡述:

Q:

DM達夢資料庫安裝,其對應版本及驅動如何選取,適配程度更佳?

A:

DM8+DmJdbcDriver18

這里提供百度云的方式供使用者下載并安裝:

https://pan.baidu.com/s/1nFBEnX3lYqIjBZo8ZPADgg

一、下載&安裝

首先,需要說明的是達夢的安裝包放一起的,沒有像Oracle那樣把客戶端獨立出來,跟windows的安裝包是一樣大的,大約1.1GB的樣子,好在的一點就是,直接解壓就可以使用,在云盤中附詳細操作指南,

解壓以后,里面有一個\source\tool\manager.exe的應用程式,可直接打開,登錄就行,

二、DM8&Client

接下來,打開DM8客戶端,可通過dm sql腳本方式去創建表,這里只是簡單創建了一張crm_version表,這里尤其需要注意的是創建表名不需要帶雙引號,達夢默認是大寫,sql方言中也不需要額外處理,若是通過DM8工具去建表建欄位或者帶小寫加雙引號創建腳本,出現雙引號則在實際的sql方言中也需要加上雙引號,否則執行sql會拋出視圖或表不存在,欄位列名不存在的例外,

若是通過Mysql或Oracle或其他資料庫,檔案等方式遷移匯入,這里記錄一下遷移程序中遇到的問題,在遷移的時候,報某些欄位超長,于是,查看了MySql中那些欄位的型別及長度,都是varchar(50) ,這里應該是遷移有些欄位,須在DM資料庫中增加位寬,在MySql中varchar是表示字符,varchar(50)表示可以存放50個字符,但是DM的默認跟Oracle是一樣的,varchar(50)表示50個位元組,這就意味著,50個位元組,如果存中文,在utf-8的字符集下,只能存最多16個,所以,如果MySql庫到DM,varchar型別,需特別留意一下,

三、DM8&DmJdbcDriver

然后,在專案工程中引入達夢資料庫驅動,SpringBoot對MySql做了集成,沒有get到對達夢資料庫做集成,小編這里采用的jdk1.8,安裝的達夢資料庫也是DM8,所以這里引入:

DmJdbcDriver18,其相對于DmJdbcDriver17作出了很大的改進,

i、本地引入的方式

在pom.xml檔案中,引入依賴jar

<!-- 達夢資料庫驅動 --><dependency>      <groupId>com.dm</groupId>       <artifactId>DmJdbcDriver18</artifactId>        <version>1.8</version>         <scope>system</scope>          <systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jar</systemPath></dependency>

ii、nexus私服引入的方式

在pom.xml檔案中,引入依賴jar

<!-- 達夢資料庫驅動 --><dependency>      <groupId>com.dm</groupId>       <artifactId>DmJdbcDriver18</artifactId>        <version>1.8</version></dependency>

說明:這里的groupId坐標引數,可由使用者自行在nexus中upload創建宣告,然后在pom.xml中引入相關坐標即可,

擴展:若是需要從本地deploy到nexus或是先獲取本地倉庫.m2的包->nexus倉庫的包->aliyun maven倉庫的包,為了解決開發程序中jar包拉取例外等問題,則在maven中settings.xml中可這樣去配置:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">       <!-- 本地倉庫 -->       <localRepository>D:/.m2</localRepository>       <mirrors>           <mirror>               <id>nexus</id>               <mirrorOf>*</mirrorOf>               <name>yd nexus</name>               <url>http://ip:port/repository/maven-public/</url>           </mirror>       </mirrors>   <mirror>    <id>alimaven</id>    <mirrorOf>central</mirrorOf>    <name>aliyun maven</name>    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>   </mirror>      <profiles>           <profile>               <id>nexus</id>               <repositories>                   <repository>                       <id>maven-snapshots</id>                       <url>http://ip:port/repository/maven-snapshots/</url>                       <releases><enabled>false</enabled></releases>                               <snapshots><enabled>true</enabled></snapshots>                   </repository>                   <repository>                       <id>maven-releases</id>                       <url>http://ip:port/repository/maven-releases/</url>                       <releases><enabled>true</enabled></releases>                               <snapshots><enabled>false</enabled></snapshots>                   </repository>               </repositories>           </profile>       </profiles>       <servers>      <server>         <id>nexus</id>         <username>yxd179</username>         <password>yxd179</password>       </server>       <server>         <id>maven-releases</id>         <username>yxd179</username>         <password>yxd179</password>       </server>       <server>         <id>maven-snapshots</id>         <username>yxd179</username>         <password>yxd179</password>       </server>     </servers>     <activeProfiles>       <activeProfile>nexus</activeProfile>     </activeProfiles>    </settings>

四、配置達夢資料庫的資訊

說明:這里采取Nacos注冊中心去管理專案工程中用到的一些配置資訊,Nacos的介紹具體可參考小編微信公眾號:每天譯點曉知識

https://mp.weixin.qq.com/s/UyQ6wHGMyrGnDRwNZaJz0Q

至此,達夢資料庫環境安裝,相關版本及其依賴的選取跟引入,配置資訊完畢,

Q:

在DM8達夢資料庫適配的專案工程中,多資料庫兼容+資料庫連接池+ORM映射框架+分頁相關控制元件?

A:

HiKari+MyBatis3.4.6+tk.MyBatis+PageHelper

hikari:資料庫連接池-Hikari3.4.2,

mybatis:ORM(物件關系映射)框架,內部封裝了 JDBC,不需要花費精力處理加載驅動、創建連接、創建 statement 等繁雜程序,

// 驅動-連接地址-賬號-密碼等資訊String driverClassName = "dm.jdbc.driver.DmDriver";String url = "jdbc:dm://localhost:5236/";String username = "yxd179";String password = "yxd179";// 加載驅動Class.forName(driverClassName);// 獲取資料庫連接物件Connection con = (Connection) DriverManager.getConnection(url,username,password);// 獲取資料庫操作物件PreparesStatement ps = con.preparesStatement("SELECT COUNT(*) FROM TEST;");// 執行sqlResultSet rs= ps.executeQuery();// 這里還可以獲取到資料庫產品名稱DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData();// 這里為后續提到的在xml指定達夢的databaseId奠定基礎System.out.println("資料庫產品名稱:" + metaData.getDatabaseProductName());最后需關閉連接close,釋放資源->rs-ps-con. 

tk.mybatis:mybatis定制的第一大業務增強庫,

pagehelper:分頁控制元件,mybatis定制的第二大業務增強庫,

Q:

DM8達夢資料庫在多資料庫切換中,其databaseId如何能夠被ORM映射框架MyBatis指定訪問?

A:

當 mybatis 在進行 mapper 注入時,當前 sql 方法的 databaseId 和當前資料源的 databaseId 一樣?當前 sql 方法的 databaseId 和當前資料源的 databaseId 不一樣?當前 sql 未配置 databaseId?

其實,這都是需要我們care到的,當mybatis裝配時,若是同一個方法被找到多條sql時,首先,會優先使用 databaseId 相同的 sql,若是沒有 databaseId 相同的sql,其次,再使用未配置 databaseId 的 sql,而databaseId 未對應的 sql 不會使用,

i、當獲取到的資料源資訊為mysql,則執行圖一中批量插入insertBatch方法;

ii、當獲取到的資料源資訊為db2,則執行圖二中批量插入insertBatch方法;

iii、當獲取到的資料源資訊為oracle,則執行圖三批量插入insertBatch方法,

上例,這樣我們就能極其簡易的指定 databaseId,很多小伙伴肯定會說為什么需要這樣去指定?其背后的原理又是怎樣的,我們是否能夠擴展并自定義 databaseId?框架這層的應用真能夠提供的這么 perfect 嗎?

在上一個Q-A中,我們已經get到了資料庫產品的名稱,可以從資料源連接物件中去獲取,不妨從這里出發,這里先提出一點 little 猜想,mybatis既然能夠支持mysql,oracle,db2等等資料庫,那么其他關系型資料庫?肯定是提供一些這樣的入口可以去擴展的,只是各種框架的適配程度不一樣,都在不斷兼容,網上關于這塊的資料并不全面,基于資料庫產品名稱這條線索,于是,小編封裝了獨立的配接器sdk,可作達夢等關系型資料庫適配,當然不同型別的資料庫,后續在sdk中去擴展兼容都是可以做到的,

說明:有興趣的童鞋請點擊譯點主頁,可公眾號后臺留言,welcome together^_^

i、通過組態檔屬性方式指定databaseId:

mybatis:
  mapper-locations: classpath*:mapper/**.xml
  configuration:
    database-id: dm8

ii、 通過configuration配置類,往容器注入Bean方式指定databaseId:

/**
 * @Auther: X.D.Yang
 * @Date: 2021/4/1 13:14
 * @Description:
 */
@Configuration
public class DatabasesConfig {

    private static final Logger logger = LoggerFactory.getLogger(DatabasesConfig.class);

    @Bean
    public DatabaseIdProvider getDatabaseIdProvider() {
        DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        Properties p = new Properties();
        logger.info("Join DM8 databaseId Starting...");
        p.setProperty("DM DBMS", "dm8");
        //p.setProperty("MySQL", "mysql");
        databaseIdProvider.setProperties(p);
        logger.info("Join DM8 databaseId Start completed.");
        return databaseIdProvider;
    }
}

iii、mybatis-config.xml配置方式指定databaseId:

<databaseIdProvider type="DB_VENDOR">
   <property name="SQL Server" value="sqlserver"/>
   <property name="DB2" value="db2"/>
   <property name="Oracle" value="oracle" />
   <property name="DM DBMS" value="dm8" />
</databaseIdProvider>

至于小編封裝的獨立sdk,其主要思想結合SpringBoot-自動裝配-條件配置

@SpringBootApplication->@SpringBootConfiguration(@Configuration注解,宣告為spring的配置類)、@EnableAutoConfigurationspringboot(啟動最關鍵的注解)、@ComponentScan(對包進行掃描)

i、其中@EnableAutoConfiguration注解會讀取所有classpath:META-INF/Spring.factories,取keyorg.springframework.boot.autoconfigure.EnableAutoConfiguration下的所有value,注冊到核心容器,完成自動配置類的加載

讀取:spring提供的工具類-SpringFactoriesLoader>>>第一個引數是個Class物件,決定讀取的key,為class物件的全類名,第二個引數是ClassLoader物件,決定從哪里開始找這個檔案,然后讀取classpath:META-INF/spring.factories檔案,

ii自動配置類上有大量自動配置生效的條件,比如依賴是否被引入,springboot采用了默認代替配置的策略,當然也可更改默認配置,比如修改application.yml>yamlproperties組態檔,手動往容器中注冊特定bean,注冊一些實作特殊介面的類,比如實作WebMvcConfigurer介面的類,自動配置即向容器注冊組件,實作了特殊介面的組件,影響spring的生命周期,

/**
 * @Auther: X.D.Yang
 * @Date: 2021/3/15 20:39
 * @Description:
 */
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getLoggedInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

    @Bean
    public LoggedInterceptor getLoggedInterceptor() {
        return new LoggedInterceptor();
    }
}

//WebMvcConfigurer介面還有很多實作方法
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
    public WebMvcConfigurerAdapter() {
    }

    public void addInterceptors(InterceptorRegistry registry) {
    }
}

其中,

@ConditionalOnClass:一些類是否存在當前類路徑下,

@ConditionalOnProperty:相應的配置欄位滿足,

@ConditionalOnMissingBean:容器中沒有某個bean,

這里我們著重看一下mybatis提供的自動配置包-MybatisAutoConfiguration,生效條件:需引入mybatis相關的依賴,核心容器中只有一個DataSource,在DataSource自動配置完成后才生效等等條件,并且還開啟了配置類@EnableConfigurationProperties(MybatisProperties.class)

上述構造方法:當前物件被實體化時,會被注入一系列的bean-MybatisProperties物件...

iii、mybatis為我們注冊了SqlSessionFactorySqlSessionTemplate,以及為每個@Mapper注冊了一個Mapper實作類-MyBatis->@Autowired注入一個Mapper,

當我們自己為容器中注入SqlSessionFactory物件,從容器中取dataSource(當引入spring-boot-starter-jdbc時會自動配置)作為引數,創建一個SqlSessionFactoryBean物件,該物件是個工廠-生產SqlSessionFactory,這里通過SqlSessionFactoryBean物件的一系列set方法,最后呼叫getObject方法來獲取到SqlSessionFactory物件,其中生成SqlSessionFactory需要的Configuration物件,這里也可以取代mybatis的主組態檔-sqlSessionFactoryBean.setConfiguration方法,

SqlSessionTemplate的創建,則取上述注入的SqlSessionFactory,new SqlSessionTemplate物件即可,至于對MyBatis原始碼Debug有興趣的可以參考小編之前的文章>https://blog.csdn.net/yxd179/article/details/84568401

記錄:在適配的程序中還試出了達夢的幻讀,達夢和Oracle一樣默認的隔離級別都是讀提交;還有特別需要注意的就是,在資料庫中varchar型別的欄位,比如在mysql中定義varchar(50),在寫滿的情況下為50個字符,到了達夢這邊最多也就是varchar(150),當然可自行指定位寬,小編用的字符集是UTF-8,每個字符占三個位元組,乘以三倍,就肯定是裝得下的,目前達夢適配現有的框架為:

HiKari+MyBatis3.4.6+tk.MyBatis+PageHelper

ok,now,接入sdk適配后,啟動的效果,大致如下:

這里,主要對sql分頁查詢作下闡述:簡單的分頁可通過手寫sql limit...,首先統計count總數,然后計算分頁等相關資訊,這里不著重說明,當然sql分頁控制元件也是可以去擴展的,PageHelper分頁,其主要原理:首先將傳遞的引數設定到page這個物件中去,然后會接著將page的副本存放入ThreadLoacl中,保證分頁時引數互不影響,通過mybatis提供的攔截器,獲取ThreadLocal中的值,重新拼裝分頁sql陳述句

接入之后,我們在控制臺輸出dm sql日志,看一下列印的sql-偽列分頁:

在DM8中正常執行sql,獲取結果集:

而在MySql中,簡單limit分頁輸出是這樣的:

<附注>Debug分頁控制元件原始碼,其實也很容易理解,分頁最終是這樣去拼裝的:

protected BoundSql getPageBoundSql(Object parameterObject) {    String tempSql = sql;    String orderBy = PageHelper.getOrderBy();    if (orderBy != null) {        tempSql = OrderByParser.converToOrderBySql(sql, orderBy);    }    tempSql = localParser.get().getPageSql(tempSql);    return new BoundSql(configuration, tempSql, localParser.get().getPageParameterMapping(configuration, original.getBoundSql(parameterObject)), parameterObject);}
//當然,這里有很多其他的Parser,這里可擴展,可兼容,去適用于不同的資料庫public String getPageSql(String sql) {    StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);    sqlBuilder.append("select * from ( select tmp_page.*, rownum row_id from ( ");    sqlBuilder.append(sql);    sqlBuilder.append(" ) tmp_page where rownum <= ? ) where row_id > ?");    return sqlBuilder.toString();}

Q:

DM8、MySql、Oracle等資料庫切換程序對比,除了各自方言異同,是否還有其他新發現?

A:

結論是肯定的,這里僅根據控制臺輸出的sql日志來看,PageHelper.startPage(0,100)VSPageHelper.startPage(1,100)

引出這樣一個小問題-思考:上述這倆者在DM8、MySql或者其他關系型資料庫中會出現不一樣的效果嗎?若是,又如何去fix^_^

附:由于時間等原因,闡述不一定俱全,本文暫時就到這里,對于達夢這塊,搜索可用資源較少,希望對各位讀者,在適配達夢資料庫程序中能夠有所幫助,歡迎提出寶貴建議^_^

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/276168.html

標籤:其他

上一篇:云原生勢不可擋,華為云GaussDB加速企業數字化轉型

下一篇:隨著日益增多的新技術,Android開發接下來的路該怎么走?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more