国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpringBoot分布式事務的解決方案(JTA+Atomic+多數據源)

Android編程精選 ? 來源:blog.csdn.net/jaryle/article/d ? 作者:blog.csdn.net/jaryle/ ? 2022-04-11 11:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

首先,到底啥是分布式事務呢,比如我們在執行一個業務邏輯的時候有兩步分別操作A數據源和B數據源,當我們在A數據源執行數據更改后,在B數據源執行時出現運行時異常,那么我們必須要讓B數據源的操作回滾,并回滾對A數據源的操作;這種情況在支付業務時常常出現;比如買票業務在最后支付失敗,那之前的操作必須全部回滾,如果之前的操作分布在多個數據源中,那么這就是典型的分布式事務回滾;

了解了什么是分布式事務,那分布式事務在java的解決方案就是JTA(即Java Transaction API);springboot官方提供了 Atomikos or Bitronix的解決思路;

其實,大多數情況下很多公司是使用消息隊列的方式實現分布式事務。

本篇文章重點講解springboot環境下,整合 Atomikos +mysql+mybatis+tomcat/jetty;

一、項目依賴

pom.xml中添加atomikos的springboot相關依賴:


<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jta-atomikosartifactId>
dependency>

點進去會發現里面整合好了:transactions-jmstransactions-jtatransactions-jdbcjavax.transaction-api

二、把數據源的相關配置項單獨提煉到一個application.yml中:

注意:

  1. 這回我們的spring.datasource.typecom.alibaba.druid.pool.xa.DruidXADataSource;

  2. spring.jta.transaction-manager-id的值在你的電腦中是唯一的,這個詳細請閱讀官方文檔;

ca6a91f8-b943-11ec-aa7f-dac502259ad0.png

完整的yml文件如下:

spring:
datasource:
type:com.alibaba.druid.pool.xa.DruidXADataSource
druid:

systemDB:
name:systemDB
url:jdbc//localhost:3306/springboot-mybatis?useUnicode=true&characterEncoding=utf-8
username:root
password:root
#下面為連接池的補充設置,應用到上面所有數據源中
#初始化大小,最小,最大
initialSize:5
minIdle:5
maxActive:20
#配置獲取連接等待超時的時間
maxWait:60000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis:60000
#配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis:30
validationQuery:SELECT1
validationQueryTimeout:10000
testWhileIdle:true
testOnBorrow:false
testOnReturn:false
#打開PSCache,并且指定每個連接上PSCache的大小
poolPreparedStatements:true
maxPoolPreparedStatementPerConnectionSize:20
filters:stat,wall
#通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多個DruidDataSource的監控數據
useGlobalDataSourceStat:true

businessDB:
name:businessDB

url:jdbc//localhost:3306/springboot-mybatis2?useUnicode=true&characterEncoding=utf-8
username:root
password:root
#下面為連接池的補充設置,應用到上面所有數據源中
#初始化大小,最小,最大
initialSize:5
minIdle:5
maxActive:20
#配置獲取連接等待超時的時間
maxWait:60000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis:60000
#配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis:30
validationQuery:SELECT1
validationQueryTimeout:10000
testWhileIdle:true
testOnBorrow:false
testOnReturn:false
#打開PSCache,并且指定每個連接上PSCache的大小
poolPreparedStatements:true
maxPoolPreparedStatementPerConnectionSize:20
filters:stat,wall
#通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多個DruidDataSource的監控數據
useGlobalDataSourceStat:true

#jta相關參數配置
jta:
log-dir:classpath:tx-logs
transaction-manager-id:txManager
三、在DruidConfig.java中實現多個數據源的注冊;分布式事務管理器的注冊;druid的注冊;
packagecom.zjt.config;

importcom.alibaba.druid.filter.stat.StatFilter;
importcom.alibaba.druid.support.http.StatViewServlet;
importcom.alibaba.druid.support.http.WebStatFilter;
importcom.alibaba.druid.wall.WallConfig;
importcom.alibaba.druid.wall.WallFilter;
importcom.atomikos.icatch.jta.UserTransactionImp;
importcom.atomikos.icatch.jta.UserTransactionManager;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
importorg.springframework.boot.web.servlet.FilterRegistrationBean;
importorg.springframework.boot.web.servlet.ServletRegistrationBean;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Primary;
importorg.springframework.core.env.Environment;
importorg.springframework.transaction.jta.JtaTransactionManager;

importjavax.sql.DataSource;
importjavax.transaction.UserTransaction;
importjava.util.Properties;

/**
*Druid配置
*
*
*/
@Configuration
publicclassDruidConfig{
@Bean(name="systemDataSource")
@Primary
@Autowired
publicDataSourcesystemDataSource(Environmentenv){
AtomikosDataSourceBeands=newAtomikosDataSourceBean();
Propertiesprop=build(env,"spring.datasource.druid.systemDB.");
ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");
ds.setUniqueResourceName("systemDB");
ds.setPoolSize(5);
ds.setXaProperties(prop);
returnds;

}

@Autowired
@Bean(name="businessDataSource")
publicAtomikosDataSourceBeanbusinessDataSource(Environmentenv){

AtomikosDataSourceBeands=newAtomikosDataSourceBean();
Propertiesprop=build(env,"spring.datasource.druid.businessDB.");
ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");
ds.setUniqueResourceName("businessDB");
ds.setPoolSize(5);
ds.setXaProperties(prop);

returnds;
}


/**
*注入事物管理器
*@return
*/
@Bean(name="xatx")
publicJtaTransactionManagerregTransactionManager(){
UserTransactionManageruserTransactionManager=newUserTransactionManager();
UserTransactionuserTransaction=newUserTransactionImp();
returnnewJtaTransactionManager(userTransaction,userTransactionManager);
}


privatePropertiesbuild(Environmentenv,Stringprefix){

Propertiesprop=newProperties();
prop.put("url",env.getProperty(prefix+"url"));
prop.put("username",env.getProperty(prefix+"username"));
prop.put("password",env.getProperty(prefix+"password"));
prop.put("driverClassName",env.getProperty(prefix+"driverClassName",""));
prop.put("initialSize",env.getProperty(prefix+"initialSize",Integer.class));
prop.put("maxActive",env.getProperty(prefix+"maxActive",Integer.class));
prop.put("minIdle",env.getProperty(prefix+"minIdle",Integer.class));
prop.put("maxWait",env.getProperty(prefix+"maxWait",Integer.class));
prop.put("poolPreparedStatements",env.getProperty(prefix+"poolPreparedStatements",Boolean.class));

prop.put("maxPoolPreparedStatementPerConnectionSize",
env.getProperty(prefix+"maxPoolPreparedStatementPerConnectionSize",Integer.class));

prop.put("maxPoolPreparedStatementPerConnectionSize",
env.getProperty(prefix+"maxPoolPreparedStatementPerConnectionSize",Integer.class));
prop.put("validationQuery",env.getProperty(prefix+"validationQuery"));
prop.put("validationQueryTimeout",env.getProperty(prefix+"validationQueryTimeout",Integer.class));
prop.put("testOnBorrow",env.getProperty(prefix+"testOnBorrow",Boolean.class));
prop.put("testOnReturn",env.getProperty(prefix+"testOnReturn",Boolean.class));
prop.put("testWhileIdle",env.getProperty(prefix+"testWhileIdle",Boolean.class));
prop.put("timeBetweenEvictionRunsMillis",
env.getProperty(prefix+"timeBetweenEvictionRunsMillis",Integer.class));
prop.put("minEvictableIdleTimeMillis",env.getProperty(prefix+"minEvictableIdleTimeMillis",Integer.class));
prop.put("filters",env.getProperty(prefix+"filters"));

returnprop;
}

@Bean
publicServletRegistrationBeandruidServlet(){
ServletRegistrationBeanservletRegistrationBean=newServletRegistrationBean(newStatViewServlet(),"/druid/*");

//控制臺管理用戶,加入下面2行進入druid后臺就需要登錄
//servletRegistrationBean.addInitParameter("loginUsername","admin");
//servletRegistrationBean.addInitParameter("loginPassword","admin");
returnservletRegistrationBean;
}

@Bean
publicFilterRegistrationBeanfilterRegistrationBean(){
FilterRegistrationBeanfilterRegistrationBean=newFilterRegistrationBean();
filterRegistrationBean.setFilter(newWebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.addInitParameter("profileEnable","true");
returnfilterRegistrationBean;
}

@Bean
publicStatFilterstatFilter(){
StatFilterstatFilter=newStatFilter();
statFilter.setLogSlowSql(true);//slowSqlMillis用來配置SQL慢的標準,執行時間超過slowSqlMillis的就是慢。
statFilter.setMergeSql(true);//SQL合并配置
statFilter.setSlowSqlMillis(1000);//slowSqlMillis的缺省值為3000,也就是3秒。
returnstatFilter;
}

@Bean
publicWallFilterwallFilter(){
WallFilterwallFilter=newWallFilter();
//允許執行多條SQL
WallConfigconfig=newWallConfig();
config.setMultiStatementAllow(true);
wallFilter.setConfig(config);
returnwallFilter;
}

}
四、分別配置每個數據源對應的sqlSessionFactory,以及MapperScan掃描的包:

MybatisDatasourceConfig.java

packagecom.zjt.config;

importcom.zjt.util.MyMapper;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.mybatis.spring.SqlSessionFactoryBean;
importorg.mybatis.spring.SqlSessionTemplate;
importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;
importorg.springframework.core.io.support.ResourcePatternResolver;

importjavax.sql.DataSource;

/**
*
*@description
*/
@Configuration
//精確到mapper目錄,以便跟其他數據源隔離
@MapperScan(basePackages="com.zjt.mapper",markerInterface=MyMapper.class,sqlSessionFactoryRef="sqlSessionFactory")
publicclassMybatisDatasourceConfig{

@Autowired
@Qualifier("systemDataSource")
privateDataSourceds;

@Bean
publicSqlSessionFactorysqlSessionFactory()throwsException{
SqlSessionFactoryBeanfactoryBean=newSqlSessionFactoryBean();
factoryBean.setDataSource(ds);
//指定mapperxml目錄
ResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
returnfactoryBean.getObject();

}

@Bean
publicSqlSessionTemplatesqlSessionTemplate()throwsException{
SqlSessionTemplatetemplate=newSqlSessionTemplate(sqlSessionFactory());//使用上面配置的Factory
returntemplate;
}

//關于事務管理器,不管是JPA還是JDBC等都實現自接口PlatformTransactionManager
//如果你添加的是 spring-boot-starter-jdbc 依賴,框架會默認注入 DataSourceTransactionManager 實例。
//在Spring容器中,我們手工注解@Bean 將被優先加載,框架不會重新實例化其他的 PlatformTransactionManager 實現類。
/*@Bean(name="transactionManager")
@Primary
publicDataSourceTransactionManagermasterTransactionManager(){
//MyBatis自動參與到spring事務管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數據源
//與DataSourceTransactionManager引用的數據源一致即可,否則事務管理會不起作用。
returnnewDataSourceTransactionManager(ds);
}*/

}

MybatisDatasource2Config.java

packagecom.zjt.config;

importcom.zjt.util.MyMapper;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.mybatis.spring.SqlSessionFactoryBean;
importorg.mybatis.spring.SqlSessionTemplate;
importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;
importorg.springframework.core.io.support.ResourcePatternResolver;

importjavax.sql.DataSource;

/**
*
*@description
*/
@Configuration
//精確到mapper目錄,以便跟其他數據源隔離
@MapperScan(basePackages="com.zjt.mapper2",markerInterface=MyMapper.class,sqlSessionFactoryRef="sqlSessionFactory2")
publicclassMybatisDatasource2Config{

@Autowired
@Qualifier("businessDataSource")
privateDataSourceds;

@Bean
publicSqlSessionFactorysqlSessionFactory2()throwsException{
SqlSessionFactoryBeanfactoryBean=newSqlSessionFactoryBean();
factoryBean.setDataSource(ds);
//指定mapperxml目錄
ResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath:mapper2/*.xml"));
returnfactoryBean.getObject();

}

@Bean
publicSqlSessionTemplatesqlSessionTemplate2()throwsException{
SqlSessionTemplatetemplate=newSqlSessionTemplate(sqlSessionFactory2());//使用上面配置的Factory
returntemplate;
}

//關于事務管理器,不管是JPA還是JDBC等都實現自接口PlatformTransactionManager
//如果你添加的是 spring-boot-starter-jdbc 依賴,框架會默認注入 DataSourceTransactionManager 實例。
//在Spring容器中,我們手工注解@Bean 將被優先加載,框架不會重新實例化其他的 PlatformTransactionManager 實現類。
/*@Bean(name="transactionManager2")
@Primary
publicDataSourceTransactionManagermasterTransactionManager(){
//MyBatis自動參與到spring事務管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數據源
//與DataSourceTransactionManager引用的數據源一致即可,否則事務管理會不起作用。
returnnewDataSourceTransactionManager(ds);
}*/

}

由于我們本例中只使用一個事務管理器:xatx,故就不在使用TxAdviceInterceptor.javaTxAdvice2Interceptor.java中配置的事務管理器了;有需求的童鞋可以自己配置其他的事務管理器;(見DruidConfig.java中查看)

五、新建分布式業務測試接口JtaTestService.java和實現類JtaTestServiceImpl.java

其實就是一個很簡單的test01()方法,在該方法中我們分別先后調用classService.saveOrUpdateTClass(tClass);teacherService.saveOrUpdateTeacher(teacher);

實現先后操作兩個數據源:然后我們可以自己debug跟蹤事務的提交時機,此外,也可以在在兩個方法全執行結束之后,手動制造一個運行時異常,來檢查分布式事務是否全部回滾;

注意:

在實現類的方法中我使用的是:

@Transactional(transactionManager="xatx",propagation=Propagation.REQUIRED,rollbackFor={java.lang.RuntimeException.class})

從而指定了使用哪個事務管理器,事務隔離級別(一般都用我這個默認的),回滾的條件(一般可以使用Exception),這三個可以自己根據業務實際修改;

packagecom.zjt.service3;

importjava.util.Map;

publicinterfaceJtaTestService{

publicMaptest01();

}
packagecom.zjt.service3.impl;


importcom.zjt.entity.TClass;
importcom.zjt.entity.Teacher;
importcom.zjt.service.TClassService;
importcom.zjt.service2.TeacherService;
importcom.zjt.service3.JtaTestService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.stereotype.Service;
importorg.springframework.transaction.annotation.Propagation;
importorg.springframework.transaction.annotation.Transactional;

importjava.util.LinkedHashMap;
importjava.util.Map;

@Service("jtaTestServiceImpl")
publicclassJtaTestServiceImplimplementsJtaTestService{

@Autowired
@Qualifier("teacherServiceImpl")
privateTeacherServiceteacherService;
@Autowired
@Qualifier("tclassServiceImpl")
privateTClassServicetclassService;

@Override
@Transactional(transactionManager="xatx",propagation=Propagation.REQUIRED,rollbackFor={java.lang.RuntimeException.class})
publicMap<String,Object>test01(){
LinkedHashMapresultMap=newLinkedHashMap();
TClasstClass=newTClass();
tClass.setName("8888");
tclassService.saveOrUpdateTClass(tClass);

Teacherteacher=newTeacher();
teacher.setName("8888");
teacherService.saveOrUpdateTeacher(teacher);

System.out.println(1/0);

resultMap.put("state","success");
resultMap.put("message","分布式事務同步成功");
returnresultMap;
}
}
六、建立JtaTestContoller.java,接受一個來自前端的http請求,觸發JtaTestService 的test01方法:
packagecom.zjt.web;


importcom.zjt.service3.JtaTestService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;

importjava.util.LinkedHashMap;
importjava.util.Map;

@Controller
@RequestMapping("/jtaTest")
publicclassJtaTestContoller{

@Autowired
@Qualifier("jtaTestServiceImpl")
privateJtaTestServicetaTestService;



@ResponseBody
@RequestMapping("/test01")
publicMaptest01(){
LinkedHashMapresultMap=newLinkedHashMap();
try{
returntaTestService.test01();
}catch(Exceptione){
resultMap.put("state","fail");
resultMap.put("message","分布式事務同步失敗");
returnresultMap;
}
}
}
七、在test.ftl中增加一個按鈕來測試;
//分布式事務測試
$("#JTATest").click(function(){
    $.ajax({
        type: "POST",
        url: "${basePath!}/jtaTest/test01",
        data: {}    ,
        async: false,
        error: function (request) {
            layer.alert("與服務器連接失敗/(ㄒoㄒ)/~~");
            return false;
        },
        success: function (data) {
            if (data.state == 'fail') {
                layer.alert(data.message);
                return false;
            }else if(data.state == 'success'){
                layer.alert(data.message);
            }
        }
    });
});
 

八、啟動服務,驗證結果:
ca76e2aa-b943-11ec-aa7f-dac502259ad0.png

點擊這個按鈕,跳轉到controller:

ca88376c-b943-11ec-aa7f-dac502259ad0.png

當正常執行了sql語句之后,我們可以發現數據庫并沒有變化,因為整個方法的事務還沒有走完,當我們走到1/0這步時:

ca9d69c0-b943-11ec-aa7f-dac502259ad0.png

拋出運行時異常,并被spring事務攔截器攔截,并捕獲異常:

caae8480-b943-11ec-aa7f-dac502259ad0.png

this.completeTransactionAfterThrowing(txInfo, var16);方法中會將事務全部回滾:

2204.243logback[http-nio-8080-exec-5]INFOc.a.i.imp.CompositeTransactionImp-rollback()doneoftransaction192.168.1.103.tm0000400006

此時,當我們再次打開數據庫驗證,依舊沒有變化,證明分布式事務配置成功;

大家可以基于我的代碼自己練習一下,自己嘗試著使用多事務管理器的情況下的靈活配置;

九、后記:

本文源代碼:

https://github.com/zhaojiatao/springboot-zjt-chapter10-springboot-atomikos-mysql-mybatis-druid.git

代碼在tomcat和jetty環境下均可完成事務回滾;

在事務回滾時可能報一個Transactional not active的警告,我google后,老外也說不出這個具體作用,大部分人認為這只是一個警告,可以忽略;

-End-

審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • API
    API
    +關注

    關注

    2

    文章

    2368

    瀏覽量

    66756
  • 分布式
    +關注

    關注

    1

    文章

    1093

    瀏覽量

    76579
  • 數據源
    +關注

    關注

    1

    文章

    66

    瀏覽量

    10087
  • SpringBoot
    +關注

    關注

    0

    文章

    177

    瀏覽量

    684

原文標題:SpringBoot 分布式事務的解決方案(JTA+Atomic+多數據源)

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    TiDB分布式數據庫運維實踐

    TiDB 是 PingCAP 開發的開源分布式關系型數據庫,兼容 MySQL 5.7 協議,底層存儲基于 TiKV(分布式 KV 存儲)和 RocksDB。它解決的核心問題是:當單機 MySQL 無法承載
    的頭像 發表于 03-04 15:44 ?55次閱讀

    配電自動化站所終端智能分布式功能閉環仿真測試案例

    深圳市科瑞杰科技有限公司-本次項目用到的是智能分布式DTU典型測試配網模型,實時仿真的結果符合實際情況,各種動態響應很好的模擬了現場實際工況,為分布式DTU的測試提供了很好的解決方案
    的頭像 發表于 02-04 17:35 ?523次閱讀
    配電自動化站所終端智能<b class='flag-5'>分布式</b>功能閉環仿真測試案例

    意法半導體與AutoCore推出基于以太網的ZCU分布式音頻解決方案

    ,意法半導體(STMicroelectronics,簡稱ST)與奧特酷智能科技(南京)有限公司(簡稱AutoCore)近日聯合宣布,雙方已達成深度戰略合作,并共同推出了一款極具行業顛覆性的創新成果——基于以太網的ZCU分布式音頻解決方案
    的頭像 發表于 02-01 17:33 ?1522次閱讀
    意法半導體與AutoCore推出基于以太網的ZCU<b class='flag-5'>分布式</b>音頻<b class='flag-5'>解決方案</b>

    分布式能源管理物聯網解決方案

    ,構建全鏈路能源數據采集與管控體系,實現分布式能源的精細化管理與智能化運維。 方案架構 終端設備層:現場設備包括光伏逆變器、智能電表、電池管理系統(BMS)等各類能源設備,支持IEC61850、IEC101/103/104、DL
    的頭像 發表于 01-21 11:39 ?316次閱讀
    <b class='flag-5'>分布式</b>能源管理物聯網<b class='flag-5'>解決方案</b>

    逐點半導體分布式渲染解決方案助力真我GT8系列電競獨顯芯片R1性能躍升

    突破手機渲染能力限制,開啟低功耗高畫質視覺新體驗 專業的圖像和顯示處理方案提供商逐點半導體今日宣布,為真我GT8系列搭載的電競獨顯芯片R1提供先進的分布式渲染解決方案。該方案通過集成超
    的頭像 發表于 11-11 17:42 ?570次閱讀

    全新分布式智慧投屏終端開啟智慧教學新時代!

    全新分布式智慧教室系統的核心設備是分布式智慧投屏終端,集無線投屏、白板書寫、多機聯動、信息發布于一體,為老師學生分組投屏、互動分享提供多屏協作解決方案。智能書寫功能與方案中多屏互動相輔
    的頭像 發表于 09-19 11:35 ?791次閱讀
    全新<b class='flag-5'>分布式</b>智慧投屏終端開啟智慧教學新時代!

    【節能學院】Acrel-1000DP分布式光伏監控系統在奉賢平高食品 4.4MW 分布式光伏中應用

    分布式光伏本地和遠程通信方案,并研究分布式光伏采集模型的構建、多數據融合估計、面向分布式光伏的
    的頭像 發表于 08-23 08:04 ?3490次閱讀
    【節能學院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏監控系統在奉賢平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中應用

    分布式光伏發電監測系統技術方案

    分布式光伏發電監測系統技術方案 柏峰【BF-GFQX】一、系統目標 :分布式光伏發電監測系統旨在通過智能化的監測手段,實現對分布式光伏電站的全方位、高精度、實時化管理。該系統能
    的頭像 發表于 08-22 10:51 ?3194次閱讀
    <b class='flag-5'>分布式</b>光伏發電監測系統技術<b class='flag-5'>方案</b>

    分布式IO選型指南:2025年分布式無線遠程IO品牌及采集控制方案詳解

    。2025年,分布式IO市場呈現出技術革新與品牌競爭加劇的態勢。本文基于權威數據平臺(如Statista、MarketsandMarkets、Grand View Research)的市場分析,全面解讀分布式無線遠程IO的選型要
    的頭像 發表于 06-23 09:48 ?1194次閱讀

    分布式IO模組選購指南:2025主流品牌盤點與應用方案解析

    分布式IO模塊市場進入快速增長期。本文基于權威數據平臺的市場分析,盤點2025年主流分布式IO模塊品牌,介紹優勢產品,并解析典型應用方案,旨在為企業選購提供權威參考。
    的頭像 發表于 06-10 16:57 ?1287次閱讀

    安科瑞分布式光伏監控系統:高效、安全、智能的綠色能源解決方案

    ?并網標準如何滿足?運維成本如何降低?安科瑞電氣股份有限公司憑借多年行業經驗,創新推出Acrel-1000DP分布式光伏監控系統,為光伏電站提供全生命周期解決方案。 一、分布式光伏發電系統標準規范 1.并網標準
    的頭像 發表于 05-08 16:40 ?727次閱讀

    從430到531,安科瑞分布式光伏方案以智應變破局未來

    日之后至 5 月 31 日建成并網的項目,部分不再適用固定上網電價政策;5 月 31 日之后并網的項目,都不再享受固定上網電價政策。政策更迭在行業內掀起搶裝熱潮。 安科瑞分布式光伏解決方案 安科瑞分布式光伏
    的頭像 發表于 05-08 15:24 ?531次閱讀
    從430到531,安科瑞<b class='flag-5'>分布式</b>光伏<b class='flag-5'>方案</b>以智應變破局未來

    兆芯+圖云創智—可信分布式存儲系統解決方案

    圖云創智分布式存儲系統采用全分布式設計與先進的存儲虛擬化技術相結合,由多個獨立的兆芯 x86 服務器作為存儲節點,聯合道熵存儲軟件和思贊博微可信計算技術實現統一資源調度、縱向橫向無縫擴展、全場景應用與存儲接口支持、自動化運維管理等技術手段以滿足海量
    的頭像 發表于 04-23 10:29 ?938次閱讀
    兆芯+圖云創智—可信<b class='flag-5'>分布式</b>存儲系統<b class='flag-5'>解決方案</b>

    分布式存儲數據恢復—虛擬機上hbase和hive數據數據恢復案例

    分布式存儲數據恢復環境: 16臺某品牌R730xd服務器節點,每臺服務器節點上有數臺虛擬機。 虛擬機上部署Hbase和Hive數據庫。 分布式存儲故障:
    的頭像 發表于 04-17 11:05 ?714次閱讀

    分布式光伏運維困境如何破?安科瑞光伏運維云平臺來支招

    一、分布式光伏的發展與現狀 ? 在全球積極推進清潔能源轉型的大背景下,分布式光伏作為一種綠色、高效的能源解決方案,正逐漸成為能源領域的重要發展方向。近年來,分布式光伏在全球范圍內呈現出
    的頭像 發表于 03-24 14:38 ?812次閱讀
    <b class='flag-5'>分布式</b>光伏運維困境如何破?安科瑞光伏運維云平臺來支招