`
junge8618
  • 浏览: 123039 次
  • 性别: Icon_minigender_1
  • 来自: 邵阳
社区版块
存档分类
最新评论

转:在Spring中用select last_insert_id()时遇到问题

阅读更多
转自:http://www.jb51.net/article/18248.htm
直使用的Oracle数据库,通过序列来实现自增字段,插入之前就已经获得了自增id,保存下来即可在后来的操作中使用
今天在使用MySQL时却不知如何处理,插入记录后不知怎样获得刚刚插入的id,查过文档后发现了select last_insert_id(),在插入之后执行此查询,即可获得自增id,喜出望外。
可用到自己的程序中之后却得不到想要的结果,于是就怀疑到了Spring头上,因为通过基本JDBC测试是没有任何问题的,所以就去跟踪Spring JDBC, 看过源码之后才豁然开朗,原来Spring中如此获得数据库Connection的:Connection con = DataSourceUtils.getConnection(getDataSource());, 哎,只能怪自己Spring掌握不够好,所以就不能在执行insert之后去执行select last_insert_id()了,因为select last_insert_id()是真对当前Connection插入和更新操作的,那在Spring中如何获得新增记录的键值呢,没有办法只能去Google了。

发现了如下文章,来自IT168,标题为《Spring应用数据主键的生成策略盘点》,摘录如下:


在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对于高并发的系统,这很容易返回错误的主键。通过带缓存的DataFieldMaxValueIncrementer,可以一次获取批量的主键值,供多次插入领域对象时使用,它的执行性能是很高的。

使用数据库的自增主键
我们经常使用数据的自增字段作为表主键,也即主键值不在应用层产生,而是在新增记录时,由数据库产生。这样,应用层在保存对象前并不知道对象主键值,而必须在保存数据后才能从数据库中返回主键值。在很多情况下,我们需要获取新对象持久化后的主键值。在Hibernate等ORM框架,新对象持久化后,Hibernate会自动将主键值绑定到对象上,给程序的开发带来了很多方便。

在JDBC 3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中。使用Statement时,可以通过以下方法绑定主键值:
int executeUpdate(String sql,int autoGeneratedKeys)
也可以通过Connection创建绑定自增值的PreparedStatement:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)

当autoGeneratedKeys参数设置为Statement.RETURN_GENERATED_KEYS值时即可绑定数据库产生的主键值,设置为Statement.NO_GENERATED_KEYS时,不绑定主键值。下面的代码演示了Statement绑定并获取数据库产生的主键值的过程:
Statement stmt = conn.createStatement(); String sql = "INSERT INTO t_topic(topic_title,user_id) VALUES(‘测试主题','123') "; stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); ①指定绑定表自增主键值 ResultSet rs = stmt.getGeneratedKeys(); if ( rs.next() ) { int key = rs.getInt();②获取对应的表自增主键值 }



Spring利用这一技术,提供了一个可以返回新增记录对应主键值的方法:
int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)
org.springframework.jdbc.support.KeyHolder是一个回调接口,Spring使用它保存新增记录对应的主键,该接口的接口方法描述如下:
Number getKey() throws InvalidDataAccessApiUsageException
当 仅插入一行数据,主键不是复合键且是数字类型时,通过该方法可以直接返回新的主键值。如果是复合主键,或者有多个主键返回时,该方法抛出 InvalidDataAccessApiUsageException。该方法是最常用的方法,因为一般情况下,我们一次仅插入一条数据并且主键字段类型为数字类型;

Map getKeys() throws InvalidDataAccessApiUsageException
如果是复合主键,则列名和列值构成Map中的一个Entry。如果返回的是多个主键,则该方法抛出InvalidDataAccessApiUsageException异常;

List getKeyList():
如果返回多个主键,即PreparedStatement新增了多条记录,则每一个主键对应一个Map,多个Map构成一个List。

Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该类返回新增记录时的自增长主键值。假设我们希望在新增论坛板块对象后,希望将主键值加载到对象中,则可以按以下代码进行调整:



public void addForum(final Forum forum) { final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; KeyHolder keyHolder = new GeneratedKeyHolder();①创建一个主键执有者 getJdbcTemplate().update(new PreparedStatementCreator(){ public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, forum.getForumName()); ps.setString(2, forum.getForumDesc()); return ps; } },keyHolder); forum.setForumId(keyHolder.getKey().intValue());②从主键执有者中获取主键 }

这样,在调用addForum(final Forum forum)新增forum领域对象后,forum将拥有对应的主键值,方便后继的使用。
在JDBC 3.0之前的版本中,PreparedStatement不能绑定主键,如果采用表自增键(如MySql的auto increment或SqlServer的identity)将给获取正确的主键值带来挑战——因为你必须在插入数据后,马上执行另一条获取新增主键的查询语句。表 1给出了不同数据库获取最新自增主键值的查询语句:
表 1 不同数据库获取新增加的主键值

数据库

获取新增主键的查询语句
DB2

IDENTITY_VAL_LOCAL()
Informix

SELECT dbinfo('sqlca.sqlerrd1') FROM <TABLE>
Sybase

SELECT @@IDENTITY
SqlServer

SELECT SCOPE_IDENTITY()或SELECT @@IDENTITY
MySql

SELECT LAST_INSERT_ID()
HsqlDB

CALL IDENTITY()
Cloudscape

IDENTITY_VAL_LOCAL()
Derby

IDENTITY_VAL_LOCAL()
PostgreSQL

SELECT nextval('<TABLE>_SEQ')

如果数据库的并发率很高,比如在插入记录后执行查询主键之前,数据库又执行了若干条插入记录的SQL语句,这时,通过表 1 返回的主键值就是最后一条插入语句的主键值,而非我们希望的主键值了。所以使用查询语句获取表自增键值是不安全的,这也是为什么有些数据库(如 Oracle、Firebird)故意不提供自增键,而只提供序列的原因,序列强制要求你在新增记录前,先获取主键值。Oracle通过SELECT <SEQUENCE_NAME>.nextval FROM DUAL获取序列的下一个值,而FireBird通过SELECT GEN_ID(<SEQUENCE_NAME> 1) FROM RDB$DATABASE获取序列的下一个值。在10.4.1小节中,我们还将讲解应用层自增键的相关知识。


应用层产生主键
Spring JDBC提供了自增键以及行集的支持,自增键对象让我们可以不依赖数据库的自增键,在应用层为新记录提供主键值。在JDK 1.4中引入了RowSet,它允许在连接断开的情况下操作数据,在这节里,我们将介绍如何在Spring JDBC中使用RowSet。

自增键的使用
一般数据库都提供了自增键的功能,如MySql的auto_increment、SqlServerr的identity字段等。Spring允许你在应用层产生主键值,为此定义了 org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer 接口,提供两种产生主键的方案:第一,通过序列产生主键;第二,通过表产生主键。根据主键产生方式和数据库的不同,Spring提供了若干实现类,如图 1所示:

图 1 DateFieldValueIncrementer继承类图
根据不同的主键产生方式,可能需要配置表名、主键字段名或序列名等信息。下面,我们以Oracle和MySql为例分别讲解使用序列及表字段产生主键值的方式。

DataFieldMaxValueIncrementer接口定义了3个获取下一个主键值的方法:
 int nextIntValue():获取下一个主键值,主键数据类型为int;
 long nextLongValue():获取下一个主键值,主键数据类型为long;
 String nextStringValue():获取下一个主键值,主键数据类型为String;
在其抽象实现类AbstractDataFieldMaxValueIncrementer中,提供了几个重要的属性,其中 incrementerName定义序列或主键表的名称;如果返回的主键是String类型,则paddingLength属性可能会派上用场,它允许你指定返回主键的长度,不足的部分前面补0。

HsqlMaxValueIncrementer和MySQLMaxValueIncrementer两个主键值产生器基于表进行工作。通过 columnName属性定义主键列的名字,通过cacheSize属性定义缓存的主键个数,当内存中的主键值用完后,产生器将一次性获取 cacheSize个主键,这样可以减少数据访问的次数,提高应用的性能。

我们通过DateFieldValueIncrementer从数据库中获取主键值来弥补这个缺陷。首先,调整PostJdbcDao的代码,添加DateFieldValueIncrementer属性,并通过它从序列中得到下一个主键值:
代码清单 13 使用DateFieldValueIncrementer产生主键



public class PostJdbcDao extends JdbcDaoSupport implements PostDao { private DataFieldMaxValueIncrementer incre; ①主键值产生器 public void addPost(final Post post) { … getJdbcTemplate().execute( sql,new AbstractLobCreatingPreparedStatementCallback( this.lobHandler) { protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { ps.setInt(1, incre.nextIntValue());②获取下一个主键值 … } }); } …//省略get/setter方法 }

在②处,我们通过incre.nextIntValue()获取下一个主键值。


以序列方式产生主键值
在Oracle数据库中创建一个seq_post_id序列,使用这个序列为t_post提供主键值,以下是创建seq_post_id的脚本:



create sequence seq_post_id increment by 1start with 1;


接着,调整Spring的配置,使用OracleSequenceMaxValueIncrementer作为主键产生器:



<bean id="incre" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"><property name="incrementerName" value="seq_post_id"/> ①指定序列名 <property name="dataSource" ref="dataSource"/> ②设置数据源 </bean><bean id="postDao" parent="dao" class="com.baobaotao.dao.jdbc.PostJdbcDao"><property name="lobHandler" ref="oracleLobHandler"/><property name="incre" ref="incre"/> ③添加主键主键产生器 </bean>

以表方式产生主键值
在Mysql中创建一张用于维护t_post主键的t_post_id表,以下是创建该表及插入初始化的SQL脚本:



create table t_post_id(sequence_id int) type = MYISAM;
insert into t_post_id values(0);

由于主键维护表的并发访问量很大,所以最好将其声明为MYISAM类型,此外需要为该表提供初始值,以便后续主键值在此之上进行递增。
调整为MySql数据库后,我们仅需要对Spring配置进行小小的调整就可以了:



<bean id="incre"class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer"><property name="incrementerName" value="t_post_id"/> ①设置维护主键的表名 <property name="columnName" value="sequence_id"/>②用于生成主键值的列名 <property name="cacheSize" value="10"/> ③缓存大小 <property name="dataSource" ref="dataSource"/></bean><bean id="postDao" parent="dao" class="com.baobaotao.dao.jdbc.PostJdbcDao"><property name="lobHandler" ref="defaultLobHandler"/><property name="incre" ref="incre"/></bean>
incrementerName和columnName都很容易理解,cacheSize决定一次返回的主键个数,这里我们设置为10。当第一次通过 MySQLMaxValueIncrementer# nextIntValue()获取主键值时,MySQLMaxValueIncrementer将使t_post_id. sequence_id递增10,而后续9次调用nextIntValue()方法时,都从缓存中获取主键值。直到第10次再次调用 nextIntValue()方法时,才会再次将t_post_id. sequence_id字段值递增10,如此循环反复。

小结
主键的生产方式从产生地点上可以分为应用层产生和数据库产生两种方式。应用层借助数据库的序列或表产生主键,这种方式可以保证程序的可移植性和安全性,同时可以通过缓存机制提高运行效率。有些数据库支持数据表自增键的主键产生机制,在JDBC 3.0以前的版本中,无法通过Statement自动获取新增记录的对应主键。这时需要在插入数据后,马上执行一条数据库相关的主键获取SQL语句以得到对应的主键值,在数据库高并发的情况下,有可能获取到不正确的主键值。在这种情况下,在插入数据前事先在应用层准备好主键值是很好的备选方案。


另外补充一点在SqlUpdate执行update之前需设置setReturnGeneratedKeys(true);
分享到:
评论

相关推荐

    三菱FX系列PLC与昆仑通态触摸屏在磨床控制中的应用及优化

    内容概要:本文详细介绍了使用三菱FX系列PLC与昆仑通态/三菱GT系列触摸屏进行磨床控制的具体方法和技术细节。主要内容涵盖PLC的梯形图编程,包括脉冲输出控制、急停逻辑、伺服电机控制等;触摸屏的HMI界面设计,涉及砂轮磨损补偿、数值输入框的边界检查、动态效果实现等;以及PLC与触摸屏之间的通讯配置和调试技巧。文中还分享了许多实际操作中的经验和注意事项,如脉冲输出模式的设置、通讯参数的一致性、硬件连接的可靠性等。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对PLC编程和HMI设计有一定基础的人群。 使用场景及目标:适用于中小型加工车间的磨床控制系统的设计与调试。主要目标是提高磨床控制系统的稳定性和精度,减少调试时间和错误发生的可能性。 其他说明:文章不仅提供了具体的编程代码和配置步骤,还分享了许多实际操作中的经验和教训,帮助读者更好地理解和掌握相关技术和技巧。

    邢台市-沙河市--街道行政区划_130582_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    邢台市-内丘县--街道行政区划_130523_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    IEEE Standard for Verilog Hardware Description Language.pdf.wim

    IEEE Standard for Verilog Hardware Description Language.pdf.wim

    晋中市-和顺县-街道行政区划_140723_Shp数据-wgs84坐标系.rar

    晋中市-和顺县-街道行政区划_140723_Shp数据-wgs84坐标系.rar

    FPGA与CY7C68013A实现USB2.0多通道高精度数据采集系统的详细解析

    内容概要:本文深入探讨了基于FPGA(Xilinx Spartan-6)和CY7C68013A的多通道数据采集系统的设计与实现。系统能够支持八路或十六路24位ADC的同时采样,并通过USB2.0接口将数据稳定传输至上位机。文中详细介绍了硬件架构的选择、FPGA内部FIFO设计、USB固件配置以及上位机软件开发等多个方面的关键技术点。特别强调了跨时钟域FIFO设计、端点配置优化、多线程同步读取等技巧对于提高系统性能的重要作用。此外,还分享了许多实际开发过程中遇到的问题及其解决方案,如电磁兼容性处理、时钟漂移补偿、数据包丢失预防等。 适合人群:从事嵌入式系统开发、FPGA编程、USB通信协议研究的专业技术人员,尤其是那些正在探索高效数据采集方案的研发人员。 使用场景及目标:适用于需要进行多通道同步数据采集的应用场合,比如工业自动化检测设备、医疗仪器、环境监测等领域。目标是帮助开发者掌握构建高性能、可靠性的数据采集系统的完整流程和技术要点。 其他说明:作者不仅提供了详细的代码片段作为参考,还分享了很多宝贵的实践经验,有助于读者更好地理解和应用相关技术。

    电力现货价格建模中基于贝叶斯校正与跳变分量的MCMC算法Matlab/C++实现及其应用

    内容概要:本文探讨了利用贝叶斯校正和跳变分量在电力现货价格建模中的应用,特别是通过MCMC算法进行参数估计的方法。文中详细介绍了模型的基本架构,即均值回归过程与多组跳变过程的叠加,并展示了如何通过Matlab和C++-Mex实现这一复杂的模型。模型的核心在于通过数据驱动的方式确定最优跳变分量个数,从而更好地捕捉电力市场价格的尖峰特性。此外,还讨论了模型的实际应用效果以及不同市场之间的差异,强调了贝叶斯框架在极端事件预测方面的优势。 适合人群:从事电力市场研究、金融工程、数据分析的专业人士,尤其是对贝叶斯统计和MCMC算法有一定了解的研究人员和技术开发者。 使用场景及目标:适用于希望提高电力现货价格预测准确性的人群,尤其是在面对频繁波动的市场环境时。通过引入多个带符号的跳变分量,能够更精确地捕捉市场动态,帮助决策者制定更好的风险管理策略。 其他说明:文中提供了详细的代码实现和后验诊断方法,确保模型不仅理论上可行,而且在实践中也能高效运行。特别指出,在不同市场环境下,模型参数会有不同的表现形式,体现了模型的高度灵活性和适应性。

    上市公司环境排放明细(2008-2021年)

    上市公司环境排放明细(2008-2021年)

    信捷XC3 PLC与施耐德ATV12变频器自动化通讯方案及应用

    内容概要:本文详细介绍了信捷XC3 PLC与施耐德ATV12变频器之间的自动化通讯解决方案。主要内容涵盖硬件连接、PLC程序逻辑设计、触摸屏交互以及断电自恢复等功能。首先,硬件方面采用RS485接口进行连接,确保通信稳定。其次,PLC程序分为三个主要部分:上电自检、实时状态轮询和频率设定。通过Modbus协议实现设备间的数据交互,并解决了通讯冲突等问题。此外,触摸屏提供了友好的人机界面,支持频率设定和状态监控。最后,实现了断电自恢复功能,确保设备在意外断电后能够自动恢复正常运行。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉PLC编程和变频器应用的专业人士。 使用场景及目标:适用于需要提高生产设备自动化水平的企业,旨在减少人工干预,提升生产效率和设备可靠性。具体应用场景包括但不限于工厂生产线、自动化控制系统等。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实施该方案。同时强调了硬件配置和参数设置的重要性,为实际项目提供宝贵的实践经验。

    120吨双级反渗透与混床系统的S7-200 Smart PLC自动化控制及加药程序详解

    内容概要:本文详细介绍了120吨双级反渗透与混床系统的自动化控制系统及其加药程序。系统采用西门子S7-200 Smart PLC进行控制,涵盖了一键制水、阻垢剂和杀菌剂的自动投加、反渗透膜保护、混床再生控制等功能。文中展示了具体的PLC编程逻辑,如定时器的应用、硬件互锁设计、模拟量处理以及HMI画面设计等。此外,还包括详细的电气图纸和操作维护手册,提供了丰富的实战经验和优化建议。 适合人群:具备一定PLC编程基础的自动化工程师和技术人员。 使用场景及目标:适用于工业水处理领域的自动化控制系统设计与实施,帮助工程师理解和掌握S7-200 Smart PLC的实际应用技巧,提高系统的可靠性和效率。 其他说明:文章不仅提供了完整的程序代码和注释,还分享了许多实战中的踩坑记录和优化建议,对于初学者来说是非常宝贵的学习资源。

    包头市-达尔罕茂明安联合旗-街道行政区划_150223_Shp数据-wgs84坐标系.rar

    包头市-达尔罕茂明安联合旗-街道行政区划_150223_Shp数据-wgs84坐标系.rar

    HCIA-Datacom高阶:vlan、vlanif、单臂路由、静态路由、ospf综合实验

    HCIA-Datacom高阶:vlan、vlanif、单臂路由、静态路由、ospf综合实验

    张家口市-桥东区--街道行政区划_130702_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    LabVIEW测试系统在工业自动化领域的应用与优势解析

    内容概要:本文详细介绍了LabVIEW测试系统在工业自动化领域的应用及其优势。首先,通过具体案例展示了LabVIEW在24小时不间断测试PCBA模块中的高效性和稳定性,特别是在异常处理和数据存储方面的强大功能。其次,文章强调了LabVIEW在硬件交互、PID控制、版本管理和文档生成等方面的优势,如利用DAQmx驱动进行精确的压力控制,以及通过Project Library机制实现无缝版本升级。此外,文中还提到LabVIEW的图形化编程特性使得复杂工程需求能够快速落地,并且提供了丰富的信号处理函数库,适用于各种测试场景。最后,文章讨论了LabVIEW在商用系统中的部署能力和售后服务支持,如快速生成报表和稳定的远程监控功能。 适合人群:从事工业自动化、测试系统开发的工程师和技术人员。 使用场景及目标:① 实现高效的工业自动化测试系统;② 提高测试系统的稳定性和可靠性;③ 加速复杂工程需求的快速落地;④ 提供便捷的版本管理和文档生成工具。 其他说明:尽管LabVIEW的图形化编程对习惯文本编码的工程师有一定学习曲线,但对于大多数标准测试场景而言,其提供的稳定性和易用性使其成为理想的开发工具。

    光伏充电站动态能量调度策略:基于MATLAB的电动汽车充放电优化与光伏利用率提升

    内容概要:本文详细介绍了光伏充电站的能量调度策略及其MATLAB实现。主要内容包括:定义关键变量如光伏出力波动容忍阈值、电价系数等,建立准入控制机制将充电站分为‘饥饿’和‘饱和’两种模式,通过计算每辆车的充放电灵活度进行车辆调度,采用动态定价策略激励车主错峰充电,以及运用凸优化算法求解最优充电方案。最终实现了光伏利用率的显著提高和车主充电体验的优化。 适合人群:对新能源汽车充电站运营、光伏能源管理和智能调度算法感兴趣的工程师和技术人员。 使用场景及目标:适用于希望深入了解并应用光伏充电站能量调度策略的研究人员和从业者。主要目标是在确保车主按时充电的前提下,最大限度地利用光伏发电,减少能源浪费,同时通过动态定价机制平衡供需关系。 其他说明:文中提供了详细的代码片段和图表解释,帮助读者更好地理解和复现该调度策略。此外,还讨论了一些实际应用中的挑战和改进建议,如精确定位车辆停留时间和引入联邦学习更新灵活度模型等。

    基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip

    基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业。 基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue3实现的仿小米商城项目源代码+项目详细文档.zip基于Vue

    基于PMU的配电系统非线性状态估计MATLAB实现及应用

    内容概要:本文详细介绍了基于PMU(phasor measurement unit)的配电系统状态估计(SSE)中引入非线性模型的方法及其实际应用。传统的线性模型将接地电阻视为固定参数,无法适应实际环境中接地电阻的变化,导致估计精度下降。文中提出了一种改进的非线性状态估计方法,将接地电阻作为状态变量纳入模型,通过构建非线性观测方程和实时更新雅可比矩阵,利用牛顿-拉夫森法进行求解。这种方法显著提高了中性点电压(NEV)和其他关键参数的估计精度,在复杂环境如雷雨天气下的表现尤为突出。此外,文章还讨论了大规模系统测试中的优化技术和实际应用案例,展示了该方法的成功预警实例。 适合人群:电力系统研究人员、电气工程师、从事配电系统状态估计的研究者和技术开发者。 使用场景及目标:适用于需要精确估计配电系统状态的应用场合,尤其是在接地电阻波动较大或存在多接地节点的情况下。主要目标是提高状态估计的准确性,确保电力系统的稳定性和安全性。 其他说明:文中提供了详细的MATLAB代码实现,并附有测试案例和性能对比数据。代码已在GitHub上开源,支持进一步的研究和开发。

    基于改进粒子群算法的微网群优化调度及其Matlab实现

    内容概要:本文详细介绍了利用Matlab实现改进粒子群算法进行微网群优化调度的方法。针对传统粒子群算法易陷入局部最优的问题,引入混沌初始化策略和动态惯性权重调整,提高了算法的全局搜索能力和收敛速度。文中展示了具体的代码实现,包括混沌序列初始化、动态电价策略、储能系统充放电控制以及功率传输优化等方面的内容。通过多个测试场景验证,改进后的算法在处理光伏出力波动和负荷突变时表现出色,特别是在负载突变场景中,收敛速度提升了62%。此外,文章还讨论了动态电价对能源调度的影响,以及储能系统和燃料电池的优化策略,最终实现了显著的成本节约和效率提升。 适合人群:从事微网调度研究的技术人员、研究生及相关领域的研究人员。 使用场景及目标:适用于需要优化多微网协同工作的场景,旨在提高微网系统的运行效率,降低成本,增强应对复杂工况的能力。 其他说明:文中提供了详细的代码片段和实验数据,便于读者理解和复现实验结果。同时强调了算法参数调整的重要性,并指出未来的研究方向可以进一步考虑风光预测误差等因素。

    三菱FX3U与台达VFD-M变频器485通讯详解及实战案例

    内容概要:本文详细介绍了三菱FX3U PLC与台达VFD-M变频器通过RS485进行Modbus RTU通讯的方法。首先讲述了硬件连接的具体步骤,包括485BD板的安装和接线注意事项。接着深入解析了变频器的关键参数设置,确保通讯顺利进行。随后展示了PLC程序的核心逻辑,特别是RS指令的应用,以及如何通过Modbus功能码实现启停控制和频率设定。此外,还提供了触摸屏配置方法,使用户能够直观地监控和调整系统。最后分享了一些常见的调试技巧和避坑指南,帮助解决实际操作中可能遇到的问题。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要将三菱FX3U PLC与台达VFD-M变频器集成在一起工作的专业人士。 使用场景及目标:适用于希望掌握三菱FX3U与台达VFD-M变频器485通讯配置的技术人员,旨在提高他们在这方面的技能水平,减少项目实施过程中可能出现的问题。 其他说明:文中不仅提供了详细的理论解释,还有丰富的实战经验和具体的操作步骤,附带完整的程序和接线图供读者参考。

Global site tag (gtag.js) - Google Analytics