Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 15

PERSISTENCIA Y DATOS TRANSACCIONALES - [GRUPO1]

Trabajo Colaborativo

Entrega proyecto 3 - Escenario 7

Presentado por

INSTITUCIÓN UNIVERSITARIA POLITÉCNICO GRAN COLOMBIANO

2020

1
Tabla de contenidos

1. Introducción.

2. Objetivos
- Objetivo General
- Objetivo Especifico

3. Desarrollo del proyecto.


- Nuevo Modelo Lógico corregido y scripts de ejecución.
- Socket server que identifica el tipo de transacción
- Socket cliente que llama al socket server, inserción de dato.
- Código de cada operación y descripción de cada paso.
- Socket cliente que llama al socket server para hacer un retiro (un update al saldo).
- Socket cliente que llama al socket server para hacer una consulta de datos (select).
- Agregar al documento el código de cada operación y explicar que hace cada programa
- Elabore un plan de pruebas

4. Lista de referencias bibliográficas.

2
INTRODUCCION

En el siguiente trabajo se expondrá el nuevo diseño reformado a partir de la primera


entrega debido a que en nuestra propia retroalimentación hemos encontrados algunas
inconsistencias que fueron registradas en la fase de ejecución. En la primera entrega se
trabajó en el desarrollo de una simulación de un sistema de transacciones bancarias
(consulta, consignación y retiro) a través de un modelo cliente-servidor vía sockets. En
esta segunda entrega se trabaja en la elaboración del código entre sockets cliente –
servidor indagando la base de datos como parte de la misma transacción.

3
OBJETIVOS

OBJETIVO GENERAL

Elaboración del código usando el programa Java a través del IDE Netbeans de Apache de
los siguientes sockets:

OBJETIVOS ESPECIFICOS

 Socket server (demonio) que identifica el tipo de transacción y ejecuta la


operación sobre la base de datos.
 Socket cliente que llama al socket server para crear un cliente (inserción de un
dato).
 Agregar al documento el código de cada operación y explicar que hace cada
programa (documentar el programa).

4
DESARROLLO DEL PROYECTO

1. Nuevo modelo lógico corregido incluyendo script de ejecución.

-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;


SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE,
SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE
_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema banco_db
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema banco_db

5
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `banco_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;
USE `banco_db` ;

-- -----------------------------------------------------
-- Table `banco_db`.`pais`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`pais` (
`codigo_pais` INT NOT NULL AUTO_INCREMENT,
`nombre_pais` VARCHAR(45) NOT NULL,
PRIMARY KEY (`codigo_pais`))
ENGINE = InnoDB
AUTO_INCREMENT = 4
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

-- -----------------------------------------------------
-- Table `banco_db`.`ciudad`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`ciudad` (
`codigo_ciudad` INT NOT NULL AUTO_INCREMENT,
`nombre_ciudad` VARCHAR(45) NOT NULL,
`codigo_pais` INT NOT NULL,
PRIMARY KEY (`codigo_ciudad`),
CONSTRAINT `fk_codigopais_codigopais`
FOREIGN KEY (`codigo_pais`)
REFERENCES `banco_db`.`pais` (`codigo_pais`))
ENGINE = InnoDB
AUTO_INCREMENT = 3
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
CREATE INDEX `fk_codigopais_codigopais_idx` ON `banco_db`.`ciudad` (`codigo_pais` ASC) VISIBLE;
-- -----------------------------------------------------
-- Table `banco_db`.`cliente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`cliente` (
`codigo_cliente` INT NOT NULL AUTO_INCREMENT,
`direccion_cliente` VARCHAR(45) NULL DEFAULT NULL,
`DNI_cliente` VARCHAR(45) NULL DEFAULT NULL,
`nombre_cliente` VARCHAR(45) NOT NULL,
`apellido_cliente` VARCHAR(45) NOT NULL,
`codigo_ciudad` INT NOT NULL,
`telefono_cliente` INT NULL DEFAULT NULL,
PRIMARY KEY (`codigo_cliente`),
CONSTRAINT `fk_codigociudad_codigociudad`
FOREIGN KEY (`codigo_ciudad`)
REFERENCES `banco_db`.`ciudad` (`codigo_ciudad`))
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

CREATE INDEX `fk_codigociudad_codigociudad_idx` ON `banco_db`.`cliente` (`codigo_ciudad` ASC) VISIBLE;

-- -----------------------------------------------------
-- Table `banco_db`.`cuenta`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`cuenta` (
`numero_cuenta` INT NOT NULL AUTO_INCREMENT,
`saldo_cuenta` INT NULL DEFAULT '0',
`codigo_cliente` INT NOT NULL,
PRIMARY KEY (`numero_cuenta`),
CONSTRAINT `fk_codigocliente_codigocliente`
FOREIGN KEY (`codigo_cliente`)
REFERENCES `banco_db`.`cliente` (`codigo_cliente`))
ENGINE = InnoDB

6
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

CREATE INDEX `fk_codigocliente_codigocliente_idx` ON `banco_db`.`cuenta` (`codigo_cliente` ASC) VISIBLE;

-- -----------------------------------------------------
-- Table `banco_db`.`tipomovimiento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`tipomovimiento` (
`tipo_movimiento` INT NOT NULL AUTO_INCREMENT,
`nombre_movimiento` VARCHAR(45) NOT NULL,
PRIMARY KEY (`tipo_movimiento`))
ENGINE = InnoDB
AUTO_INCREMENT = 4
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

-- -----------------------------------------------------
-- Table `banco_db`.`movimiento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `banco_db`.`movimiento` (
`codigo_movimiento` INT NOT NULL AUTO_INCREMENT,
`Monto` INT NULL DEFAULT '0',
`fecha_hora_movimiento` VARCHAR(45) NULL DEFAULT NULL,
`numero_cuenta` INT NOT NULL,
`tipo_movimiento` INT NOT NULL,
PRIMARY KEY (`codigo_movimiento`),
CONSTRAINT `fk_numerocuenta_numerocuenta`
FOREIGN KEY (`numero_cuenta`)
REFERENCES `banco_db`.`cuenta` (`numero_cuenta`),
CONSTRAINT `fk_tipomovimiento_tipomovimiento`
FOREIGN KEY (`tipo_movimiento`)
REFERENCES `banco_db`.`tipomovimiento` (`tipo_movimiento`))
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

CREATE INDEX `fk_numerocuenta_numerocuenta_idx` ON `banco_db`.`movimiento` (`numero_cuenta` ASC) VISIBLE;

CREATE INDEX `fk_tipomovimiento_tipomovimiento_idx` ON `banco_db`.`movimiento` (`tipo_movimiento` ASC) VISIBLE;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

7
2. Socket server que identifica el tipo de transacción y ejecuta la operación sobre la
base de datos.

8
3. Socket Cliente que llama al socket server para crear un cliente + inserción de un
dato.

9
4. Agregar el código de cada operación y explicar que hace cada programa.

Un socket es un punto de comunicación por el cual un proceso puede emitir o recibir


información. Pueden emplear los protocolos TCP (Transfer Control Protocol) y el de
datagramas UDP (User Datagram Protocol).

Ejercen su funcionamiento a partir de un puerto, al cual una maquina remota se conecta si


está disponible, ejerce acciones de escucha, lectura, escritura y publicación de
información. Al final lo cierra cuando han finalizado estos procesos.

Con todo lo anterior, se estable una comunicación completa, donde hay un servidor, un
cliente y un canal de comunicación.

Operación de retiro (Update de Saldo)

Para este código, usamos una copia del archivo de socket de cliente y cambiamos la
instrucción sql dentro del bloque “try” que ejecuta las sentencias de SQL como se muestra
a continuación:

try {
      Connection conexion
=DriverManager.getConnection(url,”root”,”admin”);
      Statement instruccion = conexion.createStatement();
      String sql=”SELECT saldo_cuenta FROM cuenta WHERE numero_cuenta =
1”;
      ResultSet saldo=instrucción.executeQuery(sql);
      double retiro=500.0;

      if(saldo>=retiro){

                        double nsaldo=saldo - retiro;


                        String nmovimiento =”INSERT INTO movimiento
(monto, fecha_hora_movimiento, numero_cuenta, tipo_movimiento) VALUES
('500', '15/12/2020 7:38:00', '1', '1'); UPDATE cuenta SET saldo_cuenta
= ” + nsaldo + ” WHERE cuenta.numero_cuenta = 1;”; 

                                 instruccion.executeQuery(nmovimiento);
                                 System.out.println(“la transacción
completa”);
                                }
}

10
en este se hace una comparación entre el valor a retirar y el saldo en
la cuenta, si el saldo de la cuenta es mayor, se procede a ejecutar las
sentencias que agregan el retiro a la tabla movimientos y el UPDATE
para actualizar el nuevo saldo para la cuenta.

Operación de consulta (SELECT)

De la misma manera, generamos una nueva copia del socket de cliente para hacer la
consulta SELECT modificando únicamente el bloque “try” que ejecuta las sentencias de
SQL:

try {
      Connection conexion
=DriverManager.getConnection(url,”root”,”admin”);
      Statement instruccion = conexion.createStatement();
      String sql=”SELECT * FROM movimiento WHERE numero_cuenta = 1”;
      ResultSet movimientos=instrucción.executeQuery(sql);
      
      System.out.println(movimientos);
                                }

Seleccionamos todos las columnas de la tabla movimientos cuyo valor de


número de cuenta sea 1. 

Operación Crear Cliente

package datos;

import entidad.Cliente;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

11
import java.sql.SQLException;
import java.sql.Statement;

public class SocketCrearCliente {

ServerSocket server;
java.net.Socket socket;
int puerto = 9000;
DataOutputStream salida;
BufferedReader entrada;

Cliente cliente;
ClienteJDBC nuevocliente = new ClienteJDBC();

private String mensaje;


private String direccion;
private String dni;
private String nombre;
private String apellido;
private int ciudad;
private int telefono;

public void iniciarServer() {

try {
server = new ServerSocket(puerto);

12
socket = new java.net.Socket();
socket = server.accept();
entrada = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
salida = new DataOutputStream(socket.getOutputStream());

salida.writeUTF("Ingrese direccion del cliente: ");


mensaje=entrada.readLine();
direccion = mensaje;

salida.writeUTF("Ingrese DNI: ");


mensaje=entrada.readLine();
dni = mensaje;

salida.writeUTF("Ingrese nombre: ");


mensaje=entrada.readLine();
nombre = mensaje;

salida.writeUTF("Ingrese apellido: ");


mensaje=entrada.readLine();
apellido = mensaje;

salida.writeUTF("Ingrese codigo de la ciudad: ");


mensaje=entrada.readLine();
ciudad = Integer.parseInt(mensaje);

salida.writeUTF("Ingrese telefono: ");


mensaje=entrada.readLine();
telefono = Integer.parseInt(mensaje);

13
cliente = new Cliente(direccion,dni,nombre,apellido,ciudad,telefono);
nuevocliente.insert(cliente);

salida.writeUTF("Nuevo cliente creado");

socket.close();

} catch (Exception e) {}
};

14
Lista de referencias Bibliográficas

https://www.ejemplode.com/22-mysql/13-ejemplo_de_base_de_datos_en_mysql.html
https://programacion.net/articulo/integridad_referencial_en_mysql_263/4
https://rico-schmidt.name/pymotw-3/persistence.html
https://uniwebsidad.com/libros/algoritmos-python/capitulo-11/persistencia-de-datos
https://topicdb.wordpress.com/2-5-persistencia-concur-rencia-y-recuperacion-en-bdoo-3/

15

También podría gustarte