当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪基于Appfuse的持久层开发       Appfuse Persistence(基于Appfuse的持久层开发) Skip to end of metadataGo to start of metadata About this Tutorial This tutorial creates a new database table and the Java code to access that table. You create an object and t.........
    ▪利用socket搭建一个多客户端/服务器的框架          在设计分布式系统或者涉及到及时通信的相关内容时,我们常常需要利用socket(套接字)来进行网络通信及文件传输,如果只是一个客户端跟一个服务器端进行通信,那么这将是一.........
    ▪数据模型 Data Model        数据模型   1.数据模型的三要素 (1)数据结构数据结构是所研究的对象类型(Object Type)的集合。这些对象和对象类型是数据库的组成成分。一般可分为两类:一类是与数据类型、内.........

[1]基于Appfuse的持久层开发
    来源: 互联网  发布时间: 2013-11-19
Appfuse Persistence(基于Appfuse的持久层开发)
Skip to end of metadataGo to start of metadata
About this Tutorial

This tutorial creates a new database table and the Java code to access that table.

You create an object and then some more classes to persist (save/retrieve/delete) that object from the database. In Java speak, this object is called a Plain Old Java Object (POJO). This object basically represents a database table. With AppFuse, there is a Generics-based DAO and Manager that will CRUD all objects for you. The only time you'll need to create DAOs is when you want custom behavior or if you need finders.

AppFuse uses Hibernate for its default persistence layer. Hibernate is an Object/Relational (O/R) Framework that allows you to relate your Java Objects to database tables. It allows you to very easily perform CRUD (Create, Retrieve, Update, Delete) on your objects.

JPA  You can also use JPA as a persistence framework option. To use JPA implementation, see the Using JPA tutorial.

To get started creating a new Object and table in AppFuse's project structure, please complete the instructions below.

Table of Contents
  • Create a new POJO and add JPA Annotations
  • Create a new database table from the object using Maven
  • Create a new POJO and add JPA Annotations

    The first thing you need to do is create an object to persist. Create a simple "Person" object (in the src/main/java/**/model directory for the basic archetypes or the core/src/main/java/**/model directory for the modular archetypes) that has an id, a firstName and a lastName (as properties). For recommend package-naming conventions, see the FAQ. These tutorials use "org.appfuse.tutorial" as the root package name.


        
    [2]利用socket搭建一个多客户端/服务器的框架
        来源: 互联网  发布时间: 2013-11-19

        在设计分布式系统或者涉及到及时通信的相关内容时,我们常常需要利用socket(套接字)来进行网络通信及文件传输,如果只是一个客户端跟一个服务器端进行通信,那么这将是一件很好办的事情,但是实际情况往往是有多个客户端需要跟服务器端进行通信,那么在这种情况下我们如何实现呢?

        我们先从原理出发:客户端和服务器端一旦建立连接,套接字连接的行为就类似于打开的底层文件描述符,而且在很多方面类似于双向管道。当考虑到多个客户同时连接一个服务器的时候,我们可以看到,服务器程序在接受来自客户的一个新的连接的时候,会创建出一个新的套接字,而原先的监听套接字将被保留以继续监听以后的连接。如果服务器不能立刻接受后来的连接,他们将被放到队列中以等待处理。

        原先的套接字仍然可用并且套接字的行为就像文件描述符,这一事实给我们提供了一种同时服务多个客户的方法,如果服务器调用fork()为自己创建第二份副本,打开的套接字就将被新的子进程所继承。新的子进程可以和连接的客户进行通信,而服务器进程可以继续接受以后的客户连接,这是我们所说的第一种方式:创建子进程。这里要注意的是当我们创建好子进程之后,我们并不等待它们完成,所以必须安排服务器忽略SIGCHLD信号以避免出现僵尸进程。

        这里我们着重要描述的是第二种方式:通过select系统调用来同时处理多个客户从而避免依赖于子进程。服务器可以让select系统调用同时检查监听套接字和客户的连接套接字。一旦select调用指示有活动发生,就可以用FD_ISSET来遍历所有可能的文件描述符,以检查是那个上面有活动发生。

        如果是监听套接字可读,这说明正有一个客户试图建立连接,此时就可以调用accept而不用担心发生阻塞的可能。如果是某个客户描述符准备好了,这说明该描述符上有一个客户请求需要我们读取和处理。如果读操作返回零字节,这表示有一个客户进程已经结束,你可以关闭该套接字并把它从描述符集合中删除。

        下面给出完整的可运行C程序示例,我在中间做了英文注释:


    服务器端代码:server.cpp

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <sys/time.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    
    int main()
    {
    	int server_socketfd, client_socketfd;
    	int server_len, client_len;
    	struct sockaddr_in server_address;
    	struct sockaddr_in client_address;
    	int result;
    	fd_set readfds, testfds;
    
    	//create a socket for server
    	server_socketfd = socket(AF_INET, SOCK_STREAM, 0);
    
    	server_address.sin_family = AF_INET;
    	server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    	server_address.sin_port = htons(atoi("9092"));
    	server_len = sizeof(server_address);
    
    	bind(server_socketfd, (struct sockaddr *)&server_address, server_len);
    
    	//create a connection queue, init readfds to process the input of server_sockfd
    	listen(server_socketfd, 5);
    
    	FD_ZERO(&readfds);
    	FD_SET(server_socketfd,&readfds);
    
    	//wait for the ask of clients
    	while(1)
    	{
    		char ch;
    		int fd;
    		int nread;
    
    		testfds = readfds;
    
    		printf("server waiting...\n");
    		result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
    
    		if(result < 1)
    		{
    			perror("server");
    			exit(1);
    		}
    
    		//once you know the activity happen,use FD_ISSET to inspect every fd to find which one did the activity happen
    		for(fd = 0; fd < FD_SETSIZE; fd++)
    		{
    			if(FD_ISSET(fd, &testfds))
    			{
    				//if the activity is happened in server_socketfd, it means it is a new connection
    				if(fd == server_socketfd){
    					client_len = sizeof(client_address);
    					client_socketfd = accept(server_socketfd, (struct sockaddr *)&client_address, &client_len);
    					FD_SET(client_socketfd, &readfds);
    					printf("adding client on fd %d\n", client_socketfd);
    				}
    				//if the activity is not happened in server_socketfd, it means the client has left
    				else
    				{
    					ioctl(fd, FIONREAD, &nread);
    
    					if(nread == 0)
    					{
    						close(fd);
    						FD_CLR(fd, &readfds);
    						printf("removeing client on fd %d\n", fd);
    					}
    					else
    					{
    						read(fd, &ch, 1);
    						sleep(5);
    						printf("serving client on fd %d\n", fd);
    						ch++;
    						write(fd, &ch, 1);
    					}
    				}
    			}
    		}
    	}
    }
    

    客户端:client.c

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    
    int main()
    {
    	char ch = 'A';
    		int sockfd;
    		struct sockaddr_in skaddr;
    
    		if ((sockfd =socket(AF_INET, SOCK_STREAM, 0)) <0 ) {
    			printf("Problem creating socket \n");
    			return -1;
    		}
    
    		skaddr.sin_family = AF_INET;
    
    		inet_aton("127.0.0.1", &skaddr.sin_addr);
    		skaddr.sin_port = htons (atoi("9092"));//port number
    
    		if (connect (sockfd, (struct sockaddr *) &skaddr, sizeof(skaddr))<0) {
    			printf("Problem connecting socket \n");
    			return -1;
    		}
    
    	write(sockfd, &ch, 1);
    	read(sockfd, &ch, 1);
    	printf("char from server = %c\n", ch);
    	close(sockfd);
    	exit(0);
    }
    

    在linux下使用gcc编译成可执行文件后,运行./server启动服务端

    然后使用./client & ./client & ./client 来模拟三个客户端访问时的操作情况。

    作者:oYiShiMiLi 发表于2013-5-15 10:06:50 原文链接
    阅读:64 评论:0 查看评论

        
    [3]数据模型 Data Model
        来源: 互联网  发布时间: 2013-11-19

     

    数据模型

     

    1.数据模型的三要素

    (1)数据结构数据结构是所研究的对象类型(Object Type)的集合。这些对象和对象类型是数据库的组成成分。一般可分为两类:一类是与数据类型、内容和其它性质有关的对象;一类是与数据之间的联系有关的对象。前者如网状模型中的数据项和记录,关系模型中的域、属性和关系等。后者如网状模型中的关系模型。

    在数据库领域中,通常按照数据结构的类型来命名数据模型,进而对数据库管理系统进行分类。如层次结构、网状结构和关系结构的数据模型分别称作为层次模型、网状模型和关系模型。相应地,数据库分别称作为层次数据库、网状数据库和关系数据库。

    (2)数据操作数据操作是指对各种对象类型的实例(或值)所允许执行的操作的集合,包括操作及有关的操作规则。在数据库中,主要的操作有检索和更新(包括插入、删除、修改)两大类。数据模型定义了这些操作的定义、语法(即使用这些操作时所用的语言)。

    数据结构是对系统静态特性的描述,而数据操作是对系统动态特性的描述。两者既有联系,又有区别。

    (3)数据的约束条件数据的约束条件是完整性规则的集合。完整性规则是指在给定的数据模型中,数据及其联系所具有的制约条件和依存条件,用以限制符合数据模型的数据库的状态以及状态的变化,确保数据的正确性、有效性和一致性。

     

    2.概念模型

    数据模型是数据库系统的核心和基础。每个DBMS软件都是基于某种数据模型的。为了把现实世界中的具体事物或事物之间的联系表示成DBMS所支持的数据模型,人们首先必须将现实世界的事物及其之间的联系进行抽象,转换为信息世界的概念模型;然后将信息世界的概念模型转换为机器世界的数据模型。也就是说,首先把现实世界中的客观对象抽象成一种信息结构。这种信息结构并不依赖于具体的计算机系统和DBMS。然后,再把概念模型转换为某一计算机系统上某一DBMS所支持的数据模型。因此,概念模型是从现实世界到机器世界的一个中间层次。

    现实世界的事物反映到人的大脑之中,然后人们开始认识这些事物,经过选择、命名、分类和组织等抽象工作之后形成概念模型,并进入到信息世界。

    •用户(user)关心的是现实世界中的事物、事物的属性及其相互关系。例如,用户可能关心他的顾客及其属性,如顾客地址、银行帐号等等。用户也关心自己的定货帐目,如谁订的货、订的什么和订多少等等。

    •系统分析员(analyst)同样也关心现实世界,但是系统分析员需要分析用户的信息需求。作为需求分析的结果,分析员必须以文档的形式对需求进行结构化的描述;这个文档就是信息模型。

    •实体(Entity)实体是构成数据库的基本元素。实体是指一个存在的东西以区别这个东西所具有的属性和这个东西与其它东西的联系。实体可以是人,也可以是物;可以是实际对象,也可以是概念;可以是事物本身,也可以是指事物之间的联系。

    •属性(Attribute)一个实体可以由若干个属性来刻画。属性是相对实体而言的,是实体所具有的特性。

    •关键字(Key)能唯一地标识实体的属性的集合称为关键字(或码)。

    •域(Domain)属性的取值范围称作域。

    •实体型(Entity Type)一类实体所具有的共同特征或属性的集合称为实体型。一般用实体名及其属性来抽象地刻画一类实体的实体型。

    •实体集(Entity Set)同型实体的集合叫实体集。例如,学生就是一个实体集。实体集的名即是实体型。对于学生和(学号、姓名、年龄、系、年级)均是实体型,而学生是对实体型(学号、姓名、年龄、系、年级)所起的名称,两者是指同一客观对象。但本科生和研究生可以为相同实体型,而实体集不同。

    •联系(Relationship)现实世界的事物之间是有联系的。一般存在两类联系:一是实体内部的组成实体的属性之间的联系,二是实体之间的联系。在考虑实体内部的联系时,是把属性看作为实体。

    一般来说,两个实体之间的联系可分为三种:

    (1)一对一(1∶1)联系若对于实体集A中的每一个实体,实体集B中至多有唯一的一个实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系,记作1∶1。

    (2)一对多(1∶n)联系若对于实体集A中的每个实体,实体集B中有n个实体(n≥0)与之联系;反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1∶n。

    相应地有多对一(n∶1)联系多对一联系,从本质上说,是一对多联系的逆转。其定义同一对多联系类似,不再赘述。

    (3)多对多(m∶n)联系若对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系;反之,对于实体集B中的每一个实体,实体集A中也有m个实体(m≥0)与之对应,则称实体集A与实体集B具有多对多联系,记作m∶n。实质上,多对多联系是任意一种联系。另外,同一实体集内的各个实体间也可以有各种联系。

    概念模型的表示方法最常用的是实体一联系方法(Entity-Relationship Approach),简称E-R方法。该方法是由P.P.S.Chen在1976年提出的。

        
    最新技术文章:
     




    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3