当前位置:文档之家› 并发自定义主键生成策略

并发自定义主键生成策略

并发自定义主键生成策略
并发自定义主键生成策略

并发自定义主键生成策略

在项目开发中,我遇到一个需求.就是要生成自定义的主键.

主键的格式为:前缀+ 当天日期+ 自增长序列号

自增长序列号: 这个序列号是每天从0或1开始自增长的

在了解完需要之后,我做了简单的分析之后就马上进入编码模式,这里我使用的是mysql数据,全部代码已经上传到github,有需要的同学自行下载

目录结构(项目管理工具用的maven)

src

main

java

com.kco.bean.SequenceNumberBean com.kco.dao.SequenceNumberDao com.kco.Enum.SequenceNumberEnum com.kco.service.SequenceNumberService com.kco.service.SequenceNumberServiceImpl resources

META-INF/mybatis/mapper/SequenceNumberDao.xml META-INF/mybatis/sql-map-config.xml META-INF/spring/spring-base-jdbc.xml log4j.properties test

java

com.kco.TestSequenceNumberService pom.xml

编码

1, 首先创建一个maven工程,配置一下jar依赖pom.xml

xsi:schemalocation="https://www.doczj.com/doc/0616998015.html,/POM/4.0.0

https://www.doczj.com/doc/0616998015.html,/xsd/maven-4.0.0.xsd">

4.0.0

com.kco

mytestcode

1.0-SNAPSHOT

https://www.doczj.com/doc/0616998015.html,mons

commons-lang3

3.3.2

https://www.doczj.com/doc/0616998015.html,mons

commons-io

1.3.2

https://www.doczj.com/doc/0616998015.html,mons

commons-collections4

4.1

https://www.doczj.com/doc/0616998015.html,mons

commons-dbcp2

2.0.1

https://www.doczj.com/doc/0616998015.html,mons

commons-pool2

2.3

junit

junit

4.10

test

org.springframework

spring-test

test

4.2.3.RELEASE

mysql

mysql-connector-java

5.1.12

runtime

org.mybatis

mybatis

3.2.7

org.springframework

spring-context

4.2.3.RELEASE

org.springframework

spring-context-support

4.2.3.RELEASE

org.springframework

spring-tx

4.2.3.RELEASE

org.springframework

spring-jdbc

4.2.3.RELEASE

org.springframework

spring-beans

4.2.3.RELEASE

org.springframework

spring-aop

4.2.3.RELEASE

org.aspectj

aspectjrt

1.8.8

org.aspectj

aspectjtools

1.8.8

org.aspectj

aspectjweaver

1.8.8

org.mybatis

mybatis-spring

1.2.2

log4j

log4j

1.2.17

org.slf4j

slf4j-log4j12

1.7.13

org.slf4j

slf4j-api

1.7.13

org.slf4j

jcl-over-slf4j

runtime

1.7.13

org.apache.maven.plugins

maven-compiler-plugin

3.5.1

1.8

1.8

UTF-8

org.apache.maven.plugins

maven-resources-plugin

2.6

tbl

2., 初始化数据库

xmlns:context="https://www.doczj.com/doc/0616998015.html,/schema/context"

xmlns:tx="https://www.doczj.com/doc/0616998015.html,/schema/tx"

xmlns:xsi="https://www.doczj.com/doc/0616998015.html,/2001/XMLSchema-instance"

xsi:schemalocation="https://www.doczj.com/doc/0616998015.html,/schema/beans

https://www.doczj.com/doc/0616998015.html,/schema/beans/spring-beans.xsd

https://www.doczj.com/doc/0616998015.html,/schema/context

https://www.doczj.com/doc/0616998015.html,/schema/context/spring-context.xsd

https://www.doczj.com/doc/0616998015.html,/schema/aop

https://www.doczj.com/doc/0616998015.html,/schema/aop/spring-aop.xsd

https://www.doczj.com/doc/0616998015.html,/schema/tx

https://www.doczj.com/doc/0616998015.html,/schema/tx/spring-tx.xsd">

4, 配置mybatis sql-map-config.xml

?

5, 因为要生成自定义主键一般在开发阶段就已经能确定,所以我这里使用了一个枚举类来管理所有的自定义主键com.kco.Enum.SequenceNumberEnum

package com.kco.Enum;

import com.kco.bean.SequenceNumberBean;

/**

* com.kco.Enum

* Created by swlv on 2016/10/25.

*/

public enum SequenceNumberEnum {

GD(new SequenceNumberBean("GD","工单主键生成策略", 1, 1, 8));

private SequenceNumberBean sequenceNumberBean;

SequenceNumberEnum(SequenceNumberBean sequenceNumberBean){

this.sequenceNumberBean = sequenceNumberBean;

}

public SequenceNumberBean getSequenceNumberBean() {

return sequenceNumberBean;

}

}

6, 数据库PUB_SEQUENCE_NUMBER对应的bean类com.kco.bean.SequenceNumberBean

?

package com.kco.bean;

/**

* 主键生成策略的bean

* com.kco.bean

* Created by swlv on 2016/10/25.

*/

public class SequenceNumberBean {

private String prefix;

private String name;

private String today;

private int minNum;

private int currentNum;

private int numLength;

public String getPrefix() {

return prefix;

}

public void setPrefix(String prefix) {

this.prefix = prefix;

}

public String getName() {

return name;

}

public void setName(String name) {

https://www.doczj.com/doc/0616998015.html, = name;

}

public String getToday() {

return today;

}

public void setToday(String today) {

this.today = today;

}

public int getMinNum() {

return minNum;

}

public void setMinNum(int minNum) { this.minNum = minNum;

}

public int getCurrentNum() {

return currentNum;

}

public void setCurrentNum(int currentNum) {

this.currentNum = currentNum;

}

public int getNumLength() {

return numLength;

}

public void setNumLength(int numLength) {

this.numLength = numLength;

}

public SequenceNumberBean() {

}

public SequenceNumberBean(String prefix, String name, int minNum, int currentNum, int numLength) {

this.prefix = prefix;

https://www.doczj.com/doc/0616998015.html, = name;

this.minNum = minNum;

this.currentNum = currentNum;

this.numLength = numLength;

}

@Override

public String toString() {

return "SequenceNumberBean{" +

"prefix='" + prefix + '\'' +

", name='" + name + '\'' +

", today='" + today + '\'' +

", minNum=" + minNum +

", currentNum=" + currentNum +

", numLength=" + numLength +

'}';

}

}

7, 服务层的接口类以及实现com.kco.service.SequenceNumberService

package com.kco.service;

import com.kco.Enum.SequenceNumberEnum;

/**

* com.kco.service

* Created by swlv on 2016/10/25.

*/

public interface SequenceNumberService {

/**

* 生成一个主键

* @param sequenceNumberEnum 主键生成类型

* @return 返回一个生成的主键

*/

String newSequenceNumber(SequenceNumberEnum sequenceNumberEnum);

}

com.kco.service.SequenceNumberServiceImpl

package com.kco.service;

import com.kco.Enum.SequenceNumberEnum;

import com.kco.bean.SequenceNumberBean;

import com.kco.dao.SequenceNumberDao;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**

* com.kco.service

* Created by swlv on 2016/10/25.

*/

@Service

public class SequenceNumberServiceImpl implements SequenceNumberService{ @Resource

private SequenceNumberDao sequenceNumberDao;

@Override

public synchronized String newSequenceNumber(SequenceNumberEnum sequenceNumberEnum) {

if (sequenceNumberEnum == null){

return null;

}

try {

SequenceNumberBean sequenceNumberBean = sequenceNumberDao.newSequenceNumber(sequenceNumberEnum.getSequenceNumberBean() .getPrefix());

Thread.sleep(100);

if (sequenceNumberBean == null){

sequenceNumberBean = sequenceNumberEnum.getSequenceNumberBean();

sequenceNumberBean.setToday(sequenceNumberDao.getToday());

}

Thread.sleep(100);

sequenceNumberDao.updateSequenceNumber(sequenceNumberBean);

Thread.sleep(100);

return String.format("%s%6s%08d",

sequenceNumberBean.getPrefix(),sequenceNumberBean.getToday(), https://www.doczj.com/doc/0616998015.html,CurrentNum());

} catch (InterruptedException e) {

e.printStackTrace();

return "";

}

}

}

8, 数据库dao层接口com.kco.dao.SequenceNumberDao

?

package com.kco.dao;

import com.kco.bean.SequenceNumberBean;

import org.apache.ibatis.annotations.Param;

import org.springframework.stereotype.Repository;

/**

* com.kco.dao

* Created by swlv on 2016/10/25.

*/

@Repository

public interface SequenceNumberDao {

/**

* 根据前缀生成一个序列号信息

* @param prefix 前缀

* @return 新的序列号信息

*/

SequenceNumberBean newSequenceNumber(@Param("prefix") String prefix);

/**

* 将生成的序列号信息更新到数据库中

* @param sequenceNumberBean 需要更新信息

*/

void updateSequenceNumber(@Param("bean") SequenceNumberBean sequenceNumberBean);

/**

* 获取数据库当天日期

* @return

*/

String getToday();

}

9., dao层mybatis的实现SequenceNumberDao.xml

REPLACE INTO PUB_SEQUENCE_NUMBER(prefix,name,today,minNum,currentNum,numLength)

VALUES(#{bean.prefix},https://www.doczj.com/doc/0616998015.html,#{https://www.doczj.com/doc/0616998015.html,},

DATE_FORMAT(CURRENT_DATE(),'%Y%m%d'),#{bean.minNum},

#{bean.currentNum},#{bean.numLength})

10, 编写测试代码(模拟并发测试) com.kco.TestSequenceNumberService

package com.kco;

import com.kco.Enum.SequenceNumberEnum;

import com.kco.service.SequenceNumberService;

import https://www.doczj.com/doc/0616998015.html,mons.collections4.CollectionUtils;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.Queue;

import java.util.concurrent.ArrayBlockingQueue;

/**

* com.cmbchina.base.service

* Created by swlv on 2016/10/25.

*/

public class TestSequenceNumberService {

public static void main(String[] args) throws InterruptedException {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("META-INF/spring/spring-base-jdbc.xml");

SequenceNumberService sequenceNumberService = applicationContext.getBean(SequenceNumberService.class);

Queue queue = new ArrayBlockingQueue(200);

List list = new ArrayList<>();

for (int i = 0;i < 200; i ++){

list.add(new Thread(()->{

String key = sequenceNumberService.newSequenceNumber(SequenceNumberEnum.GD);

queue.add(key);

}));

}

for (Thread thread : list){

thread.start();

}

while (queue.size() != 200);

System.out.println(queue);

}

}

11, 至此整个项目就已经搭建完成

细节解析

在com.kco.service.SequenceNumberServiceImpl#newSequenceNumber的实现中在更新当天日期字符串时,使用的是sequenceNumberBean.setToday(sequenceNumberDao.getToday());这是因为服务器的时间跟数据库的时间有可能不一致,这里以数据库的时间为准

测试

1, 查询数据库的数据

SELECT count(1) FROM PUB_SEQUENCE_NUMBER

结果:

count(1)

2, 清空数据后,再运行com.kco.TestSequenceNumberService#main

3, 然后查一下数据库

SELECT * FROM PUB_SEQUENCE_NUMBER

prefix NAME today minNum currentNum numLength

GD 工单主键生成策略20161026 1 176 8

问题出现了,明明我是启动了200个线程在跑,怎么才生成176个主键,检查代码也没有问题啊,newSequenceNumber也加了关键字synchronized.

先把这个问题放一下,来回忆一下synchronized的用法,

synchronized是在线程池在访问共同变量时使其加锁,达到互斥的效果

共同变量?共同变量?咦,好像有什么不对劲的地方.newSequenceNumber使用的都是局部变量,没有共同变量啊!不对?是有共同变量,那个共同变量就是数据库的记录

除此之外使用synchronized还有一个问题,这个项目是web项目的一部分,一般在部署web项目都是有几个单边,即在不同的PC部署几个一模一样的代码,再通过集群访问的方式随机访问其中一台.那么这几个应用其实就是多进程程序,都不再一个JVM中执行,加synchronized来保证互斥,是不够的.

4, 既然知道是数据库同步出现了问题,那么怎么保证数据库同步呢?

上网搜索一下,发现数据库有悲观锁和乐观锁

解决方法就是在Dao层的实现

改为

?

5, 然后再重新查一下数据库

SELECT * FROM PUB_SEQUENCE_NUMBER

prefix NAME today minNum currentNum numLength

GD 工单主键生成策略20161026 1 200 8

发现问题解决了,这里是用到了数据库锁表的机制来实现同步.

以后有机会再学一下数据库同步,悲观锁和乐观锁.因为这个我还不太熟悉,这里就不卖弄了.

6., 修改一下com.kco.Enum.SequenceNumberEnum 再增加一个自定义主键GDD(new SequenceNumberBean("GDD","工单主键生成策略", 1, 1, 8))

7., 清空数据,然后运行com.kco.TestSequenceNumberService#main

8, 修改com.kco.TestSequenceNumberService2#main

将String key = sequenceNumberService.newSequenceNumber(SequenceNumberEnum.GD);改为String key = sequenceNumberService.newSequenceNumber(SequenceNumberEnum.GDD);再次运行com.kco.TestSequenceNumberService#main, 这是用来模拟两个程序同时访问数据的情况

9, 查询数据

SELECT * FROM PUB_SEQUENCE_NUMBER

prefix NAME today minNum currentNum numLength

GD 工单主键生成策略20161026 1 200 8

GDD 工单主键生成策略20161026 1 200 8

数据正常

10., 清空数据,连续运行两次com.kco.TestSequenceNumberService2#main模拟多进程对生成同一个自定义主键

11, 查询结果

SELECT * FROM PUB_SEQUENCE_NUMBER

prefix NAME today minNum currentNum numLength

GDD 工单主键生成策略20161026 1 400 8

至此, 全部搞定遗留问题

Hibernate主键生成策略

Hibernate主键生成策略 本文介绍几种常见的主键生成策略,先通过xml文件配置这种方式来介绍主键生成策略,配置主键生成方式的方法如下配置文件: 1.Assigned 该主键生成方式是在保存一条数据的时候需要人为的通过程序为主键指定值,如果不指定主键值在第一次执行保存的时候,数据也能过插入到数据库并且程序也不会出现运行错误,但是表中该条数据的主键是0,当再次执行保存的时候,程序就会出现运行错误,具体错误如下:

虽然hibernate会执行一条插入的sql语句但是程序报错执行数据回滚,因此没有插入到数据表中。 因此,在使用assigned方式来生成主键的时候,程序中必须为主键指定值。 2.Increment 这种生成方式是主键依次增加1,在每次执行插入保存数据的时候,hibernate会先查询表中主键的最大值然后加1作为本次插入数据的主键值,我们可以通过程序运行控制台打印的sql语句就可以看出,每次执行插入方法的时候hibernate会执行两条sql语句,如下:

注意用该种生成策略的时候必须将主键的类型设定为long或者int的整数类型。 3.Identity 该种方法采用自动增长的策略生成主键,生成唯一标识。Hibernate 执行一条sql语句,如下: 但是需要注意的是该种生成策略需要依赖于底层数据库的特种,只能使用有主键自动增长功能的数据库,如mysql,在设计数据库主键的时候其类型也必须是long或者int的整数类型;使用oracle 数据库的时候该种策略就行不通,因为oracle是不支持主键自动增长的。 4.Sequence 该种方法采用序列的策略生成主键,这种方式也需要依赖于底层数据库,只适用于能生成序列的数据库,如oracle;在oracle中生成sequence的语句为: create sequence seq_name increment by 1 start with 1; 每次插入数据的时候指定主键的值为seq_name.nextval(); 如果不指定自己创建的序列,hibernate会给我们提供一个默认的序列,是hibernate_sequence,也需要在数据库中创建这个序列。

数据完整性约束-主键约束

数据完整性约束(一) —— SQL Server 2016数据库及应用

由于数据库中的数据是从外界输入的,然而数据的输入由于种种原因,会发生输入无效或错误信息,数据的完整性正是为了保证输入的数据符合规定而提出的。 数据完整性分为四类: 实体完整性、域完整性、参照完整性和用户自定义完整性。

1. 实体完整性: 实体完整性要求如果属性A是关系R的主属性,则属性A不能取空值。实体完整性用于保证关系数据库表中的每条记录都是唯一的,建立主键的目的就是为了实现实体完整性。 2. 域完整性: 用来保证数据的有效性,它可以限制录入的数据与数据类型是否一致,规定字段的默认值,设置字段是否可以为空,域完整性可以确保不会输入无效的数据。

3. 参照完整性:参照完整性是基于外键的,如果表中存在外键,则外键的值必须与主表中的某条记录的被参照列的值相同,参照完整性用于确保相关联表之间的数据保持一致。当添加、删除或修改数据表中记录时,可以借助于参照完整性来保证相关表之间数据的一致性。 ClassNo ClassName Specialty EnterYear Dno 0111801 网络3181 计算机网络技 术 2018 D01 0121901 软件3191 软件技术 2019 D01 主键 Class Sno Sname Sex Birth ClassNo s011180106 陈骏 男 2000/7/5 0111801 s012190118 陈天明 男 2000/7/18 0121901 主键 外键 Student

4. 用户自定义完整性: 用户自定义完整性约束就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。 如何实现数据完整性,可以通过为表的字段设置约束来保证表中数据完整性。

机电运行控制策略

一、Metasys系统概述 根据本项目的特点,我们选择了Metasys?系统来完成本冷机群控系统的控制功能。 Metasys?系统扩展架构除了具有传统楼宇自动化及设施管理的能力和一直提供的系统特性外,还在电子信息分布的兼容性和当今商务企业网络结构上不断增强。信息科技(IT)标准的采用和Internet的使用扩展了Metasys系统能力,超出了传统楼宇控制系统的领域。经授权进入您的网络,您可以从任意电脑使用Microsoft? IE浏览器得到设施的技术及经济性能信息。网络上的服务器和集成了所有设施系统的自动化引擎实现了整个设施管理,支持多种协议,包括标准的BACnet?, LonTalk?,和已存在的Metasys系统协议。 本工程系统结构示意图 1.1 系统特点 可完全扩展的系统 为您的建筑物,校园或整个企业建立或扩展自动化系统提供一个灵活的网络结构。

●基于任务的网络访问 无论是在建筑内的网络上还是通过Internet在世界范围内的任何地方,用户都具有显示及控制的能力。 ●标准的IT协议 采用标准的IT网络技术,可以与您的企业网进行安全连接。 ●报警及事件管理 提供有效的报警和事件报告至基于Web浏览器的报警控制台、寻呼和邮件,同时报告给基于服务器的SQL数据库。 ●Metasys N1 和 BACnet 系统集成 保护已有投资,提供将已有系统集成或移植到允许Web的网络结构中,使用基于Web的用户界面。 ●支持开放的楼宇自控系统协议 集成BACnet IP、 BACnet MS/TP设备和LONWORKS? 设备至Metasys 网络中。 ●企业级集成 为企业系统进行商业分析和计划编制提供运行和历史数据。 1.2 系统组件 Metasys系统是一个完全可扩展的系统,通过系统组件组成的网络可应用于不同规模、简单或复杂的楼宇系统。 ●服务器 服务器是一个可选配的软件包,用于大型的网络、大量用户同时登陆或长时间存储历史数据。有两种规模的服务器:一种为应用和数据服务器(ADS),使用Microsoft MSDE或SQL Express数据库,运行于Windows 2000或Windows XP 操作系统,用于多用户和中等规模的楼宇中; ●网络自动化引擎(NAE) 网络自动化引擎监视现场设备控制器,内嵌的站点管理通道(Site

第十章 企业战略控制作业题答案

第十章企业战略控制思考与练习答案 一、名词解释 1.战略控制: 是指将预定的战略目标与实际效果进行比较,检测偏差程度,评价其是否符合预期目标要求,发现问题并及时采取措施藉以实现企业战略目标的动态调节过程。 2.战略控制系统: 战略控制系统是指以企业高层为主的控制系统,主要关注外部环境变化和企业内部绩效;业务控制系统是指企业的业务部门及职能部门所实施的控制系统,主要关注本部门业务的战略进展与战略目标的匹配性;作业控制系统是指企业一线操作人员对其日常生产经营活动的具体控制,主要关注职责履行与作业目标的完成情况。 3.杜邦分析法: 杜邦分析法(DuPont Analysis)是基于财务指标的战略控制方法,它利用几种主要的财务比率之间的关系来综合地分析企业的财务状况,从财务的角度来评价企业绩效和战略实施的状况。具体来说,它是一种用来评价公司赢利能力和股东权益回报水平,从财务角度评价企业绩效的一种经典方法。 4.平衡计分卡法: 平衡计分卡是以平衡为目的,寻求企业短期目标与长期目标之间、财务度量绩效与非财务度量绩效之间、企业内部流程的过程和结果之间、企业内部成长与企业外部满足顾客需求之间的平衡状态,是全面衡量企业战略管理绩效、进行战略控制的重要工具和方法。 二、简答题 1.什么是企业战略控制?其内容有哪些? (一)战略控制的含义 企业战略控制是指将预定的战略目标与实际效果进行比较,检测偏差程度,评价其是否符合预期目标要求,发现问题并及时采取措施藉以实现企业战略目标的动态调节过程。战略控制的目的主要是控制战略失效,确保战略目标的有效实现。具体体现在以下两个方面:一是保证战略方案的正确实施;二是检验、修订、优化原定战略方案。 (二)企业战略控制内容包括以下几个方面。 1.设定绩效标准 从企业实际出发,根据战略目标及企业的人力、物力、财力及信息等条件,确定评价企业战略活动的绩效标准。绩效标准的设定既要符合战略要求,又要切实可行,真正达到评价效果。 2.偏差分析 通过科学的手段及方法,用设定的绩效标准评价企业的战略活动,从中发现偏差,并分析原因。 3.设计纠偏措施

Hibernate_测试题

medal.setType("Gold Medal"); session.save(user); session.close(); } A.配置文件配置有误 B.没有在配置文件中包含对映射文件的声明 C.映射文件配置有误 D.没有开启事务 5.下列属于多对一关系的是(bd )。(选两项) A.书和作者 B.手机和生产厂家 C.用户和发布的出租信息 D.士兵和班长 6.下面是某系统中的两个实体类,依此可以得知(b )。 public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage; private Long iid; private String itemName; //项目名称,如基本工资、职位津贴等private String amount; //数额 //Getter & Setter …… } A.Wage 和WageItem 间存在单向一对多的关联 B.Wage 和WageItem 间存在单向多对一的关联 C.Wage 和WageItem间存在双向一对多的关联 D.Wage 和WageItem间存在双向多对一的关联 7.两实体类代码如下: public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage;

约束语法

SQL Server 2000支持下列五类约束:(1)DEFAULT约束(默认约束):当向数据库表中插入数据时,如果没有明确的提供输入值时,SQL S自动为该列输入指定值。(2)CHECK约束(检查约束):通过逻辑表达式判断限制插入到列中的值。(3)PRIMARY KEY约束(主键约束):不允许数据库表在指定列上具有相 同的值,且不允许有空值。(4)FOREIGN KEY约束(外键约束):定义数据库 表中指定列上插入或更新的数值必须在另一张被参照表中的特定列上存在。(5)UNIQUE约束(惟一约束):不允许数据库表在指定列上具有相同的值,但允许 有空值。约束也被分为列约束和表约束两类。列约束是指只对某一列起作用的约束。当一个约束中包含了数据库表中一个以上的列时,称为表约束。 24、约束的创建约束可以通过使用CREATE TABLE命令创建。具体语法如下: CREATE TABLE table_name (column_name data_type (NULL | NOT NULL)[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED] | UNIQUE [CLUSTERED | NONCLUSTERED] | [FOREIGN KEY] REFERENCES ref_table [(ref_column)] | DEFAULT constant_expression | CHECK(logical_expression)}][,...]) 其中,各参数的意义 为: table_name:创建约束的表名称 column_name:创建约束的列的名 称 data_type:所在列的数据类型 constraint_name:新建约束的名称 [例题37] 在tsinghua数据库中创建一张用于教师信息管理的表teachers,表中包括的教师信息分别为:教师编号、教师姓名、性别、出身年月、所在系代号、职称、办公室电话号码、科研方向以及工作状态,在创建时定义有列约束和表约束。具体命令如下: use tsinghua CREATE TABLE tsinghua.dbo.teachers (TeacherID int NOT NULL, name nvarchar(5) NOT NULL, gender nchar(1) NULL, birthday datetime NULL, DeptCode tinyint NOT NULL, Title nvarchar(5) NULL, TelCode char(8) NOT NULL, aspect nvarchar(200) NULL, status nvarchar(5) NOT NULL CONSTRAINT DF_Status DEFAULT(' 在职'), CONSTRAINT PK_Teacher PRIMARY KEY CLUSTERED(TeacherID), CONSTRAINT FK_DeptCode FOREIGN KEY (DeptCode) REFERENCES dbo.departments(DeptCode), CONSTRAINT CK_TelCode CHECK(TelCode LIKE '627[0-9][0-9][0-9][0-9][0-9]'),) go 在这个例子中,用户可以看到我们使用的约束类型依次为非空约束、默认约束、主键约束、外键约束和检查约束。在结果显示窗口中可以看到错误提示: 服务器: 消息 1767,级别 16,状态 1,行 2 外键 'FK_DeptCode' 引用了无效的表 'dbo.departments'。服务器: 消息 1750,级别 16,状态 1,行 2 未能创建约束。请参阅前面的错误信息。 这是由于还没有在数据库tsinghua中创建外键约束FK_DeptCode所需表departments,用户可以通过下面指令先创建表departments: CREATE TABLE tsinghua.dbo.departments (DeptCode tinyint NOT NULL Primary Key, DeptName nchar(20) NOT NULL, TelCode char(8) NULL) go

并发控制课后答案-简述并发控制

第八章并发控制 习题解答和解析 1. 1.在数据库中为什么要并发控制? 答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。 2. 2.并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况? 答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读"脏"数据。 (1)丢失修改(Lost Update)两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。 (2)不可重复读(Non -Repeatable Read)不可重复读是指事务T1读取数据后,事务T2 执行更新操作,使T1无法再现前一次读取结果。不可重复读包括三种情况:详见《概论》8.1(P266)。 (3)读"脏"数据(Dirty Read)读"脏"数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为"脏"数据,即不正确的数据。 避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。 3. 3.什么是封锁? 答:封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术。 4. 4.基本的封锁类型有几种?试述它们的含义。 答:基本的封锁类型有两种:排它锁(Exclusive Locks, 简称 X 锁 )和共享锁(Share Locks,简称 S 锁)。 排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。 共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 5.如何用封锁机制保证数据的一致性 ? 答:DBMS在对数据进行读、写操作之前首先对该数据执行封锁操作,例如下图中事务T1在对A进行修改之前先对A执行XLock(A),即对A加X锁。这样,当T2请求对A加X锁时就被拒绝,T2只能等待T1释放A上的锁后才能获得对A的X锁,这时它读到的A是T1更新后 的值,再按此新的A值进行运算。这样就不会丢失 T1的更新。

关于数据库设计中主键问题的思考

关于数据库设计中主键问题的思考 文章摘要:数据库主键在数据库中占有重要地位。主键的选取策略决定了系统是否可靠、易用、高效。本文探讨了数据库设计过程当中常见的主键选取策略,并剖析了其做主键的优缺点,提出了相应的解决问题的方法。 关键字:自增标识GUID COMB 在基于关系型数据库设计时候,通常要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行记录的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除、修改时不出现错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不是本文讨论的重点,不再赘述。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。常见的数据库主键选取方式有:自动增长式、手动增长式、UniqueIdentifier、联合式(复合式)、时间序列+随机数式、“COMB(Combine)”类型。 一、自动增长式 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长式允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主

键值。 尽管自动增长式字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有主辅两张表: Order(OrderID, OrderDate) 订单表 OrderDetial(OrderID, LineNum, ProductID, Price) 订单明细表Order 表中的OrderID是自动增长型的字段。假设现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生: 首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表的OrderID列。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务模式下进行的,即要么两张表同时同时更新成功、要么全部失败,显然它们是相互矛盾的。 其次,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长式字段可能造成数据合并时的主键冲突及表关联关系的丢失。设想一个数据库中的Order表向另一个库中的Order

实验七完整性约束的创建

实验七完整性约束的创建 一、实验目的 理解数据库完整性约束的概念,掌握SQL Server 2008的完整性约束的类型及相应的创建技术。 二、实验内容 1、定义和管理主键约束。 2、定义和管理唯一性约束。 3、定义和管理检查约束。 4、定义和管理外键约束。 5、定义和管理默认值约束。 三、实验指导 在关系数据库中,实体完整性约束、参照完整性约束和域完整性约束是必须满足的完整性约束条件。在SQL Server中,通过建立“约束”等措施来实现数据完整性约束,约束包括:主键(PRIMARY KEY)约束、唯一性(UNIQUE)约束、检查(CHECK)约束、默认值(DEFAULT)约束和外键(FOREIGN KEY)约束。约束的建立可以通过对象资源管理器进行操作,也可以利用T-SQL语句进行设置。 (一)主键(PRIMARY KEY)约束 主键约束指在表中定义一个主键来唯一标识表中每一行数据。 1、在SQL Server Management Studio中设置和修改主键 在表设计器中,单击要定义为主键的列的行选择器(如果要选择多列,在单击其他列的行选择器时按住Ctrl键)。然后右键单击该列的行选择器,选择“设置主键”命令,自动创建名为“PK_”(后跟表名)的主键索引。如图7.1所示。 2、利用T-SQL语句定义和修改主键 实验7.1 在教学管理数据库JXGL中创建学生表S的同时定义主键。 在数据库引擎查询文档中输入以下语句: USE JXGL GO CREATE TABLE S (

Sno char(8) PRIMARY KEY, Sname char(8), Sex char(2), Sage smallint, Sdept varchar(50) ) GO 注意:如果要设置多列的组合为主键,需要把主键定义为表级完整性约束。 图7.1 利用表设计器管理主键 实验7.2 在定义数据表S时没有定义主键,则需要添加主键。 在数据库引擎查询文档中输入以下语句: USE JXGL GO ALTER TABLE S ADD CONSTRAINT PK_Sno PRIMARY KEY clustered(Sno) GO 单击“执行”按钮则执行该程序段,这样就创建了名字为PK_Sno的主键。(二)唯一性(UNIQUE)约束

JAVA EE试题_已整理(含答案)

JAVA EE期末考试复习材料 一、选择题: 5、以下哪个HIbernate主键生成策略是实现主键按数值顺序递增的?(A) A) increment B)Identity C)sequence D)native 6、在JSP中,Page指令的(B)属性用来引入需要的包和类。 A)Exends B)import C)language D)contentType 7、从以下哪个选项中可以获得Servlet的初始参数(C) A)Servlet B)ServletContext C)ServletConfig D)GenericServlet 8、以下关于HIbernate说法正确的是(A) A)Hibernate是ORM的一种实现方式。 B)Hibernate不要JDBC的支持。 C)属于控制层 D)对象关系映射,让对象同数据库表产生关系。 9、下面关于OPM的说法不正确的是(C) A)持久化是将程序中数据在瞬时状态和持久状态间转换的机制。 B)瞬时状态是指程序数据保存在内存中,程序退出时,数据就不存在了。 C)把关系数据库中的数据读出来不属于持久化。 D)程序数据直接保存成文本文件属于持久化。 10、下面关于SessionFactory的说法正确的是(B)

A)SessionFactory是轻量级的,可以随意创建和销毁。 B)SessionFactory是重量级的接口,不可以随意创建和销毁。 C)SessionFactory是重量级的类,不可以随意创建和销毁。 D)SessionFactory是类。 11、下面关于Hibernate中load和get的方法说法正确的是(D) A)两个方法是一样的,没有任何区别。 B)两个方法是不一样的,get先找缓存,再找数据库。 C)两个方法是不一样的,load每次都会找数据库。 D)以上说法都不对。 12、spring能管理的组件不包括(A) A)Jsp B)javabean C)pojo D)DAO 二、简答题: 1、创建一个遵循Servlet规范的java类,有几种方法?分别是哪几种? 答:7种。分别是:doGet、doPost、doPut、doDelete、doHead、doOpinion、doTrace. 2、简要说明JSP的运行原理?(过程) 答:所有JSP页面,在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet (.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。 3、简述struts的原理或画出原理图?

主动配电网运行方式及控制策略分析

主动配电网运行方式及控制策略分析 发表时间:2019-11-08T14:49:47.740Z 来源:《电力设备》2019年第13期作者:韩晓曦[导读] 摘要:分布式能源与新型负荷的逐步推广,深刻改变了电网的组成形式与运行方式,传统的配电网运行控制理论与技术不再完全适用。 (身份证号码:12010219850221XXXX 天津 300000) 摘要:分布式能源与新型负荷的逐步推广,深刻改变了电网的组成形式与运行方式,传统的配电网运行控制理论与技术不再完全适用。为适应新形势的发展,主动配电网加强了对电源侧、负荷侧和配电网的控制,强调对各种灵活性资源从被动处理到主动引导与主动利用。关键词:配电网;控制;分析本文从主动配电网的组成特点出发,结合主动配电网的运行方式分析和控制方式选择,梳理主动配电网的控制方法和手段,提出源网荷互动全局控制中心的功能设计,提出针对配电网运行数据、营销数据及电网外部数据的的数据中心支撑方案,从而支持多种形式能源接入的监视控制与双向互动,支持海量数据的处理与分析决策能力。全局控制中心主要包含全局协调优化、区域协调优化、分布式控制等内容,强调对配网运行的主动控制。通过运维支持服务、协同优 化控制、综合服务等实现全局协调优化功能,通过用能能量管理、电动汽车充电管理、储能管理、分布式能源管理等实现区域协调优化,通过储能、电动汽车、分布式能源等灵活性资源实现分布式就地控制。 1 主动配电网运行控制框架 1.1 主动配电网形态主动配电网重点关注能源生产的配给和综合利用,将其基础框架按照能源生产与消费层、能源传输层、能源管理大数据平台和能源管理应用层四个层面进行考虑。(1)能源生产与消费层为充电汽车、分布式发电、储能设备和“冷、热、电”联产构成的主动配电网能量流层,该层中的用户可是能源的生产者,也是能源的消费者,负荷具备柔性的调节能力。(2)能源传输层为主动配电系统的配电网络,具有拓扑结构灵活,潮流可控、设备利用率高等特点。(3)大数据平台使适应主动配电网特点的服务平台层,包括云平台、大数据处理技术和智能电网服务总线,支持能源生产、传输、消费等全过程的数据存储、分析、挖掘和管理。(4)能源管理应用层要求实现主动配电网各种运行与控制功能,主要有电网运行态势感知、全电压等级无功电压控制、自适应综合能源优化、分布式发电预测、馈线负荷预报、故障诊断隔离与恢复、合环冲击电流在线评估与调控、风险评估与状态检修等,同时是为能源全寿命周期提供优化控制决策和服务的集成调控—运检—营销于一体的智能决策支持系统。 1.2 控制方式选择系统控制方式对系统控制资源有着重要的影响,对系统运行的水平和可靠性起着决定性的作用。主动配电网目前的主要控制方式包括集中式、分散式、分层式等类型。其中,集中式控制利用传感器将网络潮流信息或设备状态数据上传至能源管理系统,能源管理系统利用分层分布协调控单元对分布式电源、开关等设备发布控制指令、管理电网运行。分散式控制通过分层分布式控制单元和本地协调控制器进行协调控制,其中分层分布式控制单元负责区域协调控制,本地协调控制器对本地设备状态信息进行采集,并及时给出控制命令。分层式控制融合了前述两种控制思想,通过部署顶层能源管理系统、中间层分层分布式控制单元和底层本地协调控制器等多层次控制器,进行协同工作,提高配电网管控效率。 1.3 运行控制架构 1.3.1 传统配电网运行控制架构传统配电网是电力系统向用户供电的最后一个环节,一般指从输电网接受电能,再分配给终端用户的电网。配电网一般由配电线路、配电变压器、断路器、负荷开关等配电设备,以及相关辅助设备组成。传统配电网供能模式简单,直接从高压输电网或降压后将电能送到用户。传统配电网中能源生产环节为集中式发电模式,能源传输环节为发输配的能量单向流动,能源消费环节为电网至用户的单向供需关系。 传统配电网运行控制完成变电、配电到用电过程的监视、控制和管理,一般包括应用功能、支撑平台、终端设备三个部分。应用功能一般包含运行控制自动化和用电管理自动化两块内容,实现对配电网的实时和准实时的运行监视与控制。支撑平台为各种配电网自动化及保护控制应用提供统一的支撑。终端设备采集、监测配电网各种实时、准实时信息,对配电一次设备进行调节控制,是配电网运行控制的基本执行单元。应用功能通过运行控制自动化和用电管理自动化完成配电网的运营管理。运行控制自动化主要包括配电SCADA、设备保护、停电管理、电网分析计算、负荷预测、电网控制、电能质量管理、网络重构、生产管理等功能。用电管理自动化监视用户电力负荷情况,涉及用电分析、用电监测、用电管理等环节。支持平台完成包括配电量测、用电量测、图形管理等功能数据的采集、分析、存储等,为系统运行提供数据支撑。终端应用包括电网侧和用户侧两个方面。在电网侧,通过包括RTU、传感测量设备、故障检测装置、馈线控制器等在内的二次设备对并联电抗器、开关/断路器等一次设备进行监察、测量、控制、保护和调节。在用户侧,通过电表等传感测量设备对用户的进行用电计量。 1.3.2 主动配电网运行控制架构与传统配电网运行控制相比,主动配电网运行控制形态考虑全局的优化控制目标,预先分析目标偏离的可能性,并拟定和采取预防性措施实现目标,同时通过互动服务满足用户用能的多样化需求。应用功能方面,通过互动控制模式实现配网系统的统筹优化控制,同时通过互动服务满足用户的多样化用能需求。数据平台方面,构建全网统一模型对所采集全网的各类数据进行数据整合、存储、计算、分析,服务,满足按需调用服务、公共计算服务要求。终端设备方面,充分利用就地控制响应速度快的优势,对配电节点的分布式能源和可控负载协调控制。结束语:

JavaEE简答题

JavaEE简答题修改版(30分,6题*5分) (一)第一章概述 1.三层体系结构的优点有哪些?P2 ①安全性高; ②易维护; ③快速响应; ④系统扩展灵活。 2.两层体系结构的缺点有哪些?p2-3 ①安全性低; ②部署困难; ③耗费系统资源。 3.简述Java EE的“组件-容器”编程思想。(P5,有两点,与填空题第1题互斥) ①JavaEE应用的基本单元是JavaEE组件,所有的javaEE组件都运行在特定的环境中。 ②组件的运行环境被称为容器。 4.Java EE体系结构的优点?p11,4点 ①独立于硬件配置和操作系统; ②坚持面向对象的设计原则; ③灵活性、可移植性和互操作性; ④轻松的企业信息系统集成。 (二)第三章Servlet 5.Servlet的基本工作流程?p21:6点 ①客户端将请求发送到服务器; ②服务器上的Web容器实例化Servlet,并为Servlet创建线程; ③Web容器将请求信息发送到Servlet; ④Servlet创建一个响应,并将其返回到Web容器; ⑤Web容器将响应返回客户端; ⑥服务器关闭或Servlet空闲时间超过一定限度时,调用dertory()方法退出。

6.在创建Web应用程序时,通过Servlet上下文可以实现哪些功能?p61,4点 ①访问Web应用程序资源; ②在Servlet上下文属性中保存Web应用程序信息; ③获取应用初始化参数信息; ④提供日志支持。 7.HttpServletResponse的sendRedirect方法与RequestDispatcher的forward方法有什么区 别?p68:3点 ①从操作本质上,RequestDispatcher.forward()是容器控制权的转向,在客户端浏览器的地址栏中不会显示出转向后的地址,而sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求连接。 ②从性能上,前者仍是在同一次请求处理过程中,后者是结束第一次请求,由浏览器发起一次新的请求。因此前者更高效。 ③从跳转的范围上,HttpServletResponse()能够跳转到其他服务器上的资源,而RequestDispatcher.forward()只能转向Web应用内部的资源。 8.Filter的主要用途是什么?p69: 3点 ①访问特定资源时的身份验证; ②访问资源的记录跟踪; ③访问资源的转换。 (三)第四章JSP 9.列举JSP的5个内置对象,并做简要说明。 答:request、response、out、session、application、config、pageContext、page、exception (任选5个,并用一句话说明) ①request对象:代表来自客户端的请求,它封装了用户提交的信息; ②response对象:代表服务器对客户端的响应; ③out对象:代表向客户端发送数据的对象; ④application对象:代表运行在服务器上的Web应用程序,相当于Servlet上下文; ⑤exception对象:用来处理JSP文件在执行时所有发生的错误和异常。 10.与response.sendRedirect()实现重定位有何不同?p114 response.sendRedirect()其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,在浏览器上的地址栏上可以看到地址的变化; 而则不同,它是直接在服务器端执行重定位的,浏览器并不知道。

浅谈分布式并发控制

浅谈分布式并发控制 摘要:本文首先介绍了分布式系统的基本概念和并发控制的原理及目的方法。着重描述了几种基本的分布式并发控制的技术,例如基于锁的并发控制技术、基于时间戳的并发控制技术和基于事务的并发控制技术,等等。 关键字:分布式并发控制,基于锁的并发控制,基于时间戳的并发控制,基于事务的并发控制技术 0.引言 计算机现在一般不再单独使用,办公室工作站常与远程打印机、文件服务器、数据库相联。家庭计算机也可通过调制解调器访问电子信息,如电子邮件、公告板、web节点等。大的公司和企业有成百上千乃至上万台计算机通过网络连接起来,协同控制诸如汽车生产、石油提炼、钢铁冶炼、食品生产、电站运行以及商品的设计、开发、销售等。分布式计算已经成为必不可少的技术。 1.分布式系统 分布式计算机系统是一种计算机硬件的配置方式和相应的功能配置方式。它是一种多处理器的计算机系统,各处理器通过互连网络构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻辑结构,特别适合于工业生产线自动控制和企事业单位的管理,成本低,易于维护,成为计算机在应用领域发展的一个重要方向。 分布式处理系统是一个紧密耦合的系统。并且,分布式处理系统一般有比较复杂的互连网络。它和网络的区别是:计算机网络虽然与分布式计算机系统有相同之处,但二者并不等同。分布式系统的最大特点是整个系统中的各计算机和系统资源对用户都是透明的,也就是说,用户通过键入命令就可以运行程序,由操作系统为用户选择一台最合适的计算机来运行他的程序,并把运行结果传到合适的地方,而这些都不需要用户的干预。网络则一般不对用户透明,对数据的处理需要有用户的参予。一般,分布式系统是计算机网络的一个特例。 分布式系统常常意味着各组成部分之间相当严格的同步以达到协同操作、远程过程调用(rpc:remoteproce durecall)或消息传送,而网络系统则意味基于消息的通信、可能很长的延迟(在收发消息之间)、松散的同步性以及没有全局的目标。事实上,在网络和分布式系统之间并没有很清晰的界限。但人们一般认为分布式处理的主要特征为:各部件是合作、

微网基本运行与控制策略

微网基本运行与控制策略 摘要为保证微电源与微网之间,以及微网与主电网之间功率传输的稳定、可控,需要多个微电源之间的协调控制,因此微网的整体运行控制策略至关重要。本文 系统地介绍了微网中常用的基本运行与控制策略特点,以便针对微网存在的不同 问题应用不同的控制策略。 关键词微网控制策略分层控制协调控制 0.引言 由于大多数分布式电源和储能装置输出电能的频率都不是工频,它们需要通 过电力电子装置接入微网[1]。因此逆变单元是微网中必不可少的环节,分布式电 源的逆变器控制是整个微网的底层控制。从微网运行的灵活性以及微网对传统电 网的影响方面出发,有专家提出了“即插即用”式控制方案[2],该方案的含义包括 微网对大电网的“即插即用”以及微网内多个分布式电源对微网的“即插即用”。基 于以上控制思想,微网整体控制策略可分为主从控制、对等控制以及分层控制[3],而针对微电源接口的控制方法,主要包括恒功率控制(PQ Control)、下垂控制(Droop Control)以及恒压恒频控制(V/f Control)[4]。 本文将介绍微网运行与控制存在的主要问题在此基础上阐述不同微电源的接 口控制方法,最后针对三种常用的微网控制策略以及每种策略中微电源不同的控 制方法,进行了综述和比较。 1.微网运行与控制的主要问题 典型微网是由一组放射型馈线组成,通过公共耦合点(Point of Common Coupling, PCC)与主电网相连。在PCC处设有一个主接口(Connection Interface, CI),通常由微网并网专用控制开关——固态断路器(Solid State Breaker, SSB)或背 靠背式的AC/DC/AC电力电子换流器构成。分布式电源、储能单元通过电力电子 接口(Power Electronics Interfaces,PEI)与交流母线相连,负荷主要包括阻抗性 负荷、电动机负荷及热负荷。 微网既可以通过配电网与大型电力网并联运行,形成一个大型电网与小型电 网的联合运行系统,也可以独立地运行在孤岛状态,为当地负荷提供电力需求。 联网运行时,PCC连接处应满足主电网的接口要求,微网在不参与主电网操作的 同时应减少当地电能短缺且不造成电能质量恶化。这时候,微网电压和频率由大 电网提供支撑。而在孤岛情况下,微网必须能自己维持电压和频率。在微网中, 大量电力电子装置的存在使得微网缺乏惯性,而诸如光伏发电、风力发电等可再 生能源发电系统存在输出功率的波动,这些都增加了微网频率与电压调节的难度。另一方面,在联网运行与孤岛模式相互切换的暂态,如何维持微网稳定也是值得 研究的问题。一般说来,当微网联网运行从主电网吸收功率或者为主电网提供功 率时,如果突然切换到孤岛状态,微网发出功率与负荷需求功率的不平衡将导致 微网的不稳定;而当微网从孤岛状态切换到联网模式时,与电网的同步是主要问题。为保证微电源与微网之间,以及微网与主电网之间功率传输的稳定、可控, 需要多个微电源之间的协调控制,微网的整体运行控制策略也至关重要。 2.微网的控制策略 微网的控制策略主要在于控制微电源输出功率,对电力电子接口控制主要指 对DC/AC逆变环节的控制。在通常情况下,逆变器接口的直接控制目标有两种:(1)控制输出电压幅值与频率;(2)在有电压支撑的情况下控制输出电流的幅 值与频率。着眼与不同的控制目标,微电源的逆变器接口常用的控制策略可以分

(完整版)PID控制算法与策略

第四章 控制算法与策略 按偏差的比例、积分和微分进行控制的控制器(简称为PID 控制器、也称PID 调节器),是过程控制系统中技术成熟、应用最为广泛的一种控制器。它的算法简单,参数少,易于调整,并已经派生出各种改进算法。特别在工业过程控制中,有些控制对象的精确数学模型难以建立,系统的参数不容易确定,运用控制理论分析综合要耗费很大代价,却不能得到预期的效果。所以人们往往采用PID 控制器,根据经验进行在线整定,一般都可以达到控制要求。随着计算机特别是微机技术的发展,PID 控制算法已能用微机简单实现。由于软件系统的灵活性,PID 算法可以得到修正而更加完善[14]。在本章中,将着重介绍基于数字PID 控制算法的系统的控制策略。 4.1 采用周期T 的选择 采样周期T 在微机控制系统中是一个重要参数,它的选取应保证系统采样不失真的要求,而又受到系统硬件性能的限制。采样定理给出了采样频率的下限,据此采样频率应满足,m S ωω2≥,其中m ω是原来信号的最高频率。从控制性能来考虑,采样频率应尽可能的高,但采样频率越高,对微机的运行速度要求越高,存储容量要求越大,微机的工作时间和工作量随之增加。另外,当采样频率提高到一定程度后,对系统性能的改善已不明显[14]。因此采样频率即采样周期的选择必须综合考虑下列诸因素: (1) 作用于系统的扰动信号频率。扰动频率越高,则采样频率也越高,即 采样周期越小。 (2) 对象的动态特性。采样周期应比对象的时间参数小得多,否则采样信 号无法反映瞬变过程。 (3) 执行器的响应速度。如果执行器的响应速度比较缓慢,那么过短的采 样周期和控制周期将失去意义。 (4) 对象的精度要求。在计算机速度允许的情况下,采样周期越短,系统 调节的品质越好。

保存sql server数据时报错:ids for this class must be manually assigned before calling save()

Java web中调试时出现:ids for this class must be manually assigned before calling save()..如何 解决: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned befo re calling save(): 引起问题的原因: 由Hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。 首先我的表(Info)由两个字段组成,即: int id;//主建 String name; (自己做测试,所以就简单的建了个表) 由Hibernate生成的Info.hbm.xml中是这样写的: ----------------------------------------------------- ----------------------------------------------------- 这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键) 而我这里由于id本身就是主键,所以column的属性便是id 下面是很关键的一点,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的: -------------------------------------------------------------------------------- “assigned” 主键由外部程序负责生成,在save() 之前指定一个。 “hilo” 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。 “seqhilo” 与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的Sequence,适用于支持Sequence 的数据库,如Oracle。 “increment” 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。 “identity” 采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。 “sequence”

相关主题
文本预览
相关文档 最新文档