Распределенные базы и хранилища данных

Распределенные СУБД. Архитектура MS SQL Server 2005 и ORACLE Server 10g

Разбить на страницы
Показывать лекцию целиком
Презентации к данной лекции вы можете скачать OracleArchitecture.ppt, здесь

Сервер ORACLE состоит из следующих частей.

  • Экземпляр - это набор процессов операционной системы и используемая ими память. Экземпляр Oracle состоит из двух частей: области SGA и набора фоновых процессов. Фоновые процессы выполняют рутинные задачи сопровождения, обеспечивающие работу СУБД.
  • Файлы данных. В этих файлах хранятся данные в виде таблиц, индексов и всех остальных сегментов.
  • Файлы журнала повторного выполнения. Журналы транзакций.
  • Управляющие файлы. Определяют местонахождение файлов данных и содержат другую необходимую информацию о состоянии базы данных.
  • Временные файлы. Используются при сортировке больших объемов данных и для хранения временных объектов.
  • Файлы паролей. Используются для аутентификации пользователей, выполняющих администрирование удаленно, по сети.
  • Файлы параметров определяют конфигурацию экземпляра.
  • SGA и PGA

    Oracle использует память системы (как реальную, так и виртуальную) для выполнения пользовательских процессов и самого программного обеспечения СУБД, и для кэширования объектов данных. Существуют два вида областей памяти Oracle - SGA и PGA.

    Системная память Oracle для всей базы данных называется SGA (system global агеа - системная глобальная область или Shared Global Area - разделяемая глобальная область). Данные и управляющие структуры в SGA являются разделяемыми, и все фоновые процессы Oracle и пользовательские процессы могут к ним обращаться.

    В буферном кэше сервер Oracle хранит блоки базы данных перед их записью на диск, а также после считывания с диска.

    Буфер журнала повторного выполнения используется для временного кэширования данных активного журнала повторного выполнения перед записью на диск.

    В разделяемом пуле сервер Oracle кэширует различные "программные" данные. Здесь кэшируются результаты разбора запроса, выполняемый сеансом PL/SQL-код, хранятся параметры системы, кэш словаря данных, содержащий информацию об объектах базы данных.

    PGA - память пользовательского процесса. Для каждого подключения к базе данных Oracle выделяет PGA (Process Global Area - глобальную область процесса или program global агеа - глобальную область программы) в памяти машины и, кроме того, - PGA для фоновых процессов. Эта область памяти содержит данные и управляющую информацию одного процесса и между процессами не разделяется. В PGA располагаются области сортировки, области хешей и другие структуры процесса.

    Процессы ORACLE. Отличия между SHARED и DEDICATED экземплярами

    DBWn - процесс записи в БД, отвечает за запись измененных блоков на диск.

    LGWR отвечает за сброс на диск содержимого буфера журнала повторного выполнения, находящегося в области SGA.

    PMON - монитор процессов, осуществляет управление процессами, отвечает за очистку после нештатного прекращения подключений, регистрирует запущенные экземпляры в процессе прослушивания.

    SMON - системный монитор, инициализирует структуры, осуществляет дефрагментацию таблиц, осуществляет восстановление экземпляра после сбоев и так далее.

    CKPT - процесс контрольной точки, осуществляет сброс грязных блоков на диск с пометкой синхронизации в момент времени (блок - грязный, если был изменен после подъема с диска).

    Listener - серверный процесс прослушивания, обеспечивающий физическое подключение к базе данных, выполняет запросы, читает данные с диска. На диск данные пишет фоновый процесс.

    ARCn копирует в redo log активный файл журнала повторного выполнения, когда он заполняется процессом LGWR. Эти архивные файлы журнала повторного выполнения затем можно использовать для восстановления носителя.

    RECO восстанавливает транзакции, оставшиеся в готовом состоянии из-за сбоя или потери связи в ходе изменения данных на нескольких удаленных базах.

    Dn отвечает за обслуживание разделяемым сервером клиентов.

    При использовании выделенного сервера имеется соответствие один к одному между клиентским сеансом и серверным процессом (идеально подходит системам оперативной обработки транзакций - ООТ). В режиме MTS (Multi-Threaded Server, архитектура многопотокового сервера) соответствие - многие к одному (много клиентов и один разделяемый сервер).

    Табличные пространства. Структура табличных пространств. Типы табличных пространств

    Словарь данных (словарь данных Oracle)

    Первыми таблицами, создаваемыми в любой базе данных, являются системные таблицы. Системные таблицы хранят информацию о структуре базы данных и объектов внутри нее, и Oracle обращается к ним, когда нуждается в информации о базе данных или когда выполняет операторы DDL, DML. Обновление в этих таблицах происходит в фоновом режиме всякий раз, когда выполняется оператор DDL.

    Сегменты отката UNDO (ROLLBACK)

    Когда данные в Oracle изменяются, изменение должно быть или подтверждено, или отменено. Если изменение отменяется ("откатывается назад"), содержимое блоков данных восстанавливается в исходное состояние, существовавшее до изменения. Сегменты отката - это системные объекты, которые поддерживают этот процесс. Используются для хранения старых образов данных при выполнении транзакций.

    Временные (TEMPORARY)

    Временные сегменты используют пространство в файлах базы данных, чтобы создать временную рабочую область для промежуточных стадий обработки SQL и для больших операций сортировки.

    Словарь ORACLE. Типы (группы) таблиц словаря. Получение информации о таблицах словаря. Отличия между v$, DBA_, USER_, ALL_ группами таблиц

    Словарь данных. Первыми таблицами, создаваемыми в любой базе данных, являются системные таблицы, или словарь данных Oracle. Системные таблицы хранят информацию о структуре базы данных и объектов внутри нее, и Oracle обращается к ним, когда нуждается в информации о базе данных или когда выполняет оператор DDL (Data Definition Language - язык определения данных) либо оператор DML (Data Manipulation Language - язык манипулирования данными). Эти таблицы никогда непосредственно не обновляются, однако обновление в них происходит в фоновом режиме всякий раз, когда выполняется оператор DDL. Главные таблицы словаря данных содержат нормализованную информацию, которая является довольно трудной для восприятия человеком, так что в Oracle предусмотрен набор представлений, выдающих информацию главных системных таблиц в более понятном виде. Oracle запрашивает информацию из таблиц словаря данных для синтаксического разбора любого оператора SQL. Информация кэшируется в области словаря данных разделяемого пула в SGA.

    v$ - виртуальные представления словаря данных (доступны пользователю SYS), динамические таблицы производительности, доступные пользователю SYS, позволяют управлять производительностью работы сервера СУБД.

    Префиксом USER снабжаются представления, наиболее интересные для обычного пользователя, объекты, владелец которых - текущий пользователь, префиксом ALL снабжаются все доступные пользователю представления и префиксом DBA - доступные пользователям с системными полномочиями, данные о БД.

    Информацию из таблиц словаря можно выбирать с помощью оператора select. Информация о таблицах и представлениях словаря данных - dict (dictionary), информация о столбцах словаря данных - dict_columns. Информация о каждом параметре инициализации сервера БД (просмотр параметров экземпляра) - v$parameter.

    Практические занятия

    Постановка задачи. Проектирование данных на концептуальном и логическом уровнях. Нормализация отношений.

    Презентация по ER-моделированию

    ER нотации

    Пример модели в ERwin

    Подготовка SQL скриптов генерации схемы отношений БД в ERwin. Разработка скрипта для ввода тестовой информации.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Архитектура MS SQL Server 2005. Настройка и использование основных компонент среды. Создание учебной базы данных.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Работа с СУБД MS SQL Server 2005, ORACLE 10g. Примеры соединений с БД, технологии разработки клиенского приложения

    Использование технологии Java Database Connectivity (JDBC) для работы с базами данных

    Презентация

    Примеры к презентации

    SQL-скрипты, проект и исходные коды

    package org.mai806.jdbcsample;
    
    import java.sql.*;
    
    public class QuerySample {
        
        public static void main(String[] args) throws Exception {
            
            /* ======== Подключение к MS SQL Server ===== */
            // Загрузка драйвера
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                    "jdbc:sqlserver://localhost:1433;databaseName=o01;", 
                    // localhost - сервер СУБД, o01 - имя базы данных
                    "sa", "123"); // пользователь, пароль
            
            /* ======== Подключение к Oracle ============
            // Загрузка драйвера
            Class.forName("oracle.jdbc.OracleDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                            "jdbc:oracle:thin:@localhost:1521:orcl", 
                            // localhost - сервер СУБД, orcl - SID базы оракла
                            "o01", "o01"); // пользователь, пароль         
            
            // Создание Statement
            PreparedStatement stmt = connection.prepareStatement
            ("select ID, NAME from PERSON where NAME like ?");
            stmt.setString(1, "%S%");
            // Выполнение запроса
            ResultSet rs = stmt.executeQuery();
            // Перебор результата выполнения запроса
            while(rs.next()) {
                // Пример выбора параметра по номеру или по имени
                System.out.println("ID: " +
                        rs.getLong(1) + "; NAME="+
                        rs.getString("NAME"));
            }
            
            // закрытие использованных ресурсов БД
            rs.close();
            stmt.close();
            connection.close();
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class StoredProcedureSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            transferAmount(1,2,100.0);
            connection.close();
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to, double amount)
        throws Exception {
            // Создание Statement
            CallableStatement stmt
                    = connection.prepareCall("{call TransferAmount(?,?,?)}");
            // Установка параметров
            stmt.setLong(1, from);
            stmt.setLong(2, to);
            stmt.setDouble(3, amount);
            // Выполнение процедуры
            stmt.execute(); 
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class TransactionalSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            // Ручное управление транзакциями
            connection.setAutoCommit(false);
            
            try {
                transferAmount(2, 1, 10.0);
            } finally {
                connection.close();
            }
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to,
                double amount) throws Exception {
            PreparedStatement stmt = null;
            Statement query = null;
            try {
                stmt = connection.prepareStatement
                ("update ACCOUNT set AMOUNT=AMOUNT+? where ID=?");
                // Забираем сумму со счета плательщика
                stmt.setDouble(1, -amount);
                stmt.setLong(2, from);
                stmt.execute();
                
                // Добавляем сумму на счет получателя
                stmt.setDouble(1, amount);
                stmt.setLong(2, to);
                stmt.execute();
                
                // Пост-проверка: отрицательность счета плательщика
                query = connection.createStatement();
                ResultSet rs = query.executeQuery(
                        "select AMOUNT from ACCOUNT where ID="+from+" and AMOUNT<0");
                if (rs.next()) {
                    throw new Exception("На счете №"+from+" 
                    недосточно средств ["+(amount+rs.getDouble(1))+"] 
                    для снятия суммы ["+amount+"]");
                }
                connection.commit();
                System.out.println("Перечисление средств успешно выполнено");
            } catch(Exception e) {
                e.printStackTrace();
                connection.rollback();
            } finally {
                if (stmt!=null)
                    stmt.close();
                if (query!=null)
                    query.close();
            }
        }
        
    }

    Работа с базами данных из J2EE Web-контейнера

    Презентация

    Объектно-реляционное отображения для работы с базами данных

    Презентация

    Использование препроцессора для работы с API СУБД

    Презентация

    Страницы:
    Презентации к данной лекции вы можете скачать OracleArchitecture.ppt, здесь

    Сервер ORACLE состоит из следующих частей.

  • Экземпляр - это набор процессов операционной системы и используемая ими память. Экземпляр Oracle состоит из двух частей: области SGA и набора фоновых процессов. Фоновые процессы выполняют рутинные задачи сопровождения, обеспечивающие работу СУБД.
  • Файлы данных. В этих файлах хранятся данные в виде таблиц, индексов и всех остальных сегментов.
  • Файлы журнала повторного выполнения. Журналы транзакций.
  • Управляющие файлы. Определяют местонахождение файлов данных и содержат другую необходимую информацию о состоянии базы данных.
  • Временные файлы. Используются при сортировке больших объемов данных и для хранения временных объектов.
  • Файлы паролей. Используются для аутентификации пользователей, выполняющих администрирование удаленно, по сети.
  • Файлы параметров определяют конфигурацию экземпляра.
  • SGA и PGA

    Oracle использует память системы (как реальную, так и виртуальную) для выполнения пользовательских процессов и самого программного обеспечения СУБД, и для кэширования объектов данных. Существуют два вида областей памяти Oracle - SGA и PGA.

    Системная память Oracle для всей базы данных называется SGA (system global агеа - системная глобальная область или Shared Global Area - разделяемая глобальная область). Данные и управляющие структуры в SGA являются разделяемыми, и все фоновые процессы Oracle и пользовательские процессы могут к ним обращаться.

    В буферном кэше сервер Oracle хранит блоки базы данных перед их записью на диск, а также после считывания с диска.

    Буфер журнала повторного выполнения используется для временного кэширования данных активного журнала повторного выполнения перед записью на диск.

    В разделяемом пуле сервер Oracle кэширует различные "программные" данные. Здесь кэшируются результаты разбора запроса, выполняемый сеансом PL/SQL-код, хранятся параметры системы, кэш словаря данных, содержащий информацию об объектах базы данных.

    PGA - память пользовательского процесса. Для каждого подключения к базе данных Oracle выделяет PGA (Process Global Area - глобальную область процесса или program global агеа - глобальную область программы) в памяти машины и, кроме того, - PGA для фоновых процессов. Эта область памяти содержит данные и управляющую информацию одного процесса и между процессами не разделяется. В PGA располагаются области сортировки, области хешей и другие структуры процесса.

    Процессы ORACLE. Отличия между SHARED и DEDICATED экземплярами

    DBWn - процесс записи в БД, отвечает за запись измененных блоков на диск.

    LGWR отвечает за сброс на диск содержимого буфера журнала повторного выполнения, находящегося в области SGA.

    PMON - монитор процессов, осуществляет управление процессами, отвечает за очистку после нештатного прекращения подключений, регистрирует запущенные экземпляры в процессе прослушивания.

    SMON - системный монитор, инициализирует структуры, осуществляет дефрагментацию таблиц, осуществляет восстановление экземпляра после сбоев и так далее.

    CKPT - процесс контрольной точки, осуществляет сброс грязных блоков на диск с пометкой синхронизации в момент времени (блок - грязный, если был изменен после подъема с диска).

    Listener - серверный процесс прослушивания, обеспечивающий физическое подключение к базе данных, выполняет запросы, читает данные с диска. На диск данные пишет фоновый процесс.

    ARCn копирует в redo log активный файл журнала повторного выполнения, когда он заполняется процессом LGWR. Эти архивные файлы журнала повторного выполнения затем можно использовать для восстановления носителя.

    RECO восстанавливает транзакции, оставшиеся в готовом состоянии из-за сбоя или потери связи в ходе изменения данных на нескольких удаленных базах.

    Dn отвечает за обслуживание разделяемым сервером клиентов.

    При использовании выделенного сервера имеется соответствие один к одному между клиентским сеансом и серверным процессом (идеально подходит системам оперативной обработки транзакций - ООТ). В режиме MTS (Multi-Threaded Server, архитектура многопотокового сервера) соответствие - многие к одному (много клиентов и один разделяемый сервер).

    Табличные пространства. Структура табличных пространств. Типы табличных пространств

    Словарь данных (словарь данных Oracle)

    Первыми таблицами, создаваемыми в любой базе данных, являются системные таблицы. Системные таблицы хранят информацию о структуре базы данных и объектов внутри нее, и Oracle обращается к ним, когда нуждается в информации о базе данных или когда выполняет операторы DDL, DML. Обновление в этих таблицах происходит в фоновом режиме всякий раз, когда выполняется оператор DDL.

    Сегменты отката UNDO (ROLLBACK)

    Когда данные в Oracle изменяются, изменение должно быть или подтверждено, или отменено. Если изменение отменяется ("откатывается назад"), содержимое блоков данных восстанавливается в исходное состояние, существовавшее до изменения. Сегменты отката - это системные объекты, которые поддерживают этот процесс. Используются для хранения старых образов данных при выполнении транзакций.

    Временные (TEMPORARY)

    Временные сегменты используют пространство в файлах базы данных, чтобы создать временную рабочую область для промежуточных стадий обработки SQL и для больших операций сортировки.

    Словарь ORACLE. Типы (группы) таблиц словаря. Получение информации о таблицах словаря. Отличия между v$, DBA_, USER_, ALL_ группами таблиц

    Словарь данных. Первыми таблицами, создаваемыми в любой базе данных, являются системные таблицы, или словарь данных Oracle. Системные таблицы хранят информацию о структуре базы данных и объектов внутри нее, и Oracle обращается к ним, когда нуждается в информации о базе данных или когда выполняет оператор DDL (Data Definition Language - язык определения данных) либо оператор DML (Data Manipulation Language - язык манипулирования данными). Эти таблицы никогда непосредственно не обновляются, однако обновление в них происходит в фоновом режиме всякий раз, когда выполняется оператор DDL. Главные таблицы словаря данных содержат нормализованную информацию, которая является довольно трудной для восприятия человеком, так что в Oracle предусмотрен набор представлений, выдающих информацию главных системных таблиц в более понятном виде. Oracle запрашивает информацию из таблиц словаря данных для синтаксического разбора любого оператора SQL. Информация кэшируется в области словаря данных разделяемого пула в SGA.

    v$ - виртуальные представления словаря данных (доступны пользователю SYS), динамические таблицы производительности, доступные пользователю SYS, позволяют управлять производительностью работы сервера СУБД.

    Префиксом USER снабжаются представления, наиболее интересные для обычного пользователя, объекты, владелец которых - текущий пользователь, префиксом ALL снабжаются все доступные пользователю представления и префиксом DBA - доступные пользователям с системными полномочиями, данные о БД.

    Информацию из таблиц словаря можно выбирать с помощью оператора select. Информация о таблицах и представлениях словаря данных - dict (dictionary), информация о столбцах словаря данных - dict_columns. Информация о каждом параметре инициализации сервера БД (просмотр параметров экземпляра) - v$parameter.

    Практические занятия

    Постановка задачи. Проектирование данных на концептуальном и логическом уровнях. Нормализация отношений.

    Презентация по ER-моделированию

    ER нотации

    Пример модели в ERwin

    Подготовка SQL скриптов генерации схемы отношений БД в ERwin. Разработка скрипта для ввода тестовой информации.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Архитектура MS SQL Server 2005. Настройка и использование основных компонент среды. Создание учебной базы данных.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Работа с СУБД MS SQL Server 2005, ORACLE 10g. Примеры соединений с БД, технологии разработки клиенского приложения

    Использование технологии Java Database Connectivity (JDBC) для работы с базами данных

    Презентация

    Примеры к презентации

    SQL-скрипты, проект и исходные коды

    package org.mai806.jdbcsample;
    
    import java.sql.*;
    
    public class QuerySample {
        
        public static void main(String[] args) throws Exception {
            
            /* ======== Подключение к MS SQL Server ===== */
            // Загрузка драйвера
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                    "jdbc:sqlserver://localhost:1433;databaseName=o01;", 
                    // localhost - сервер СУБД, o01 - имя базы данных
                    "sa", "123"); // пользователь, пароль
            
            /* ======== Подключение к Oracle ============
            // Загрузка драйвера
            Class.forName("oracle.jdbc.OracleDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                            "jdbc:oracle:thin:@localhost:1521:orcl", 
                            // localhost - сервер СУБД, orcl - SID базы оракла
                            "o01", "o01"); // пользователь, пароль         
            
            // Создание Statement
            PreparedStatement stmt = connection.prepareStatement
            ("select ID, NAME from PERSON where NAME like ?");
            stmt.setString(1, "%S%");
            // Выполнение запроса
            ResultSet rs = stmt.executeQuery();
            // Перебор результата выполнения запроса
            while(rs.next()) {
                // Пример выбора параметра по номеру или по имени
                System.out.println("ID: " +
                        rs.getLong(1) + "; NAME="+
                        rs.getString("NAME"));
            }
            
            // закрытие использованных ресурсов БД
            rs.close();
            stmt.close();
            connection.close();
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class StoredProcedureSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            transferAmount(1,2,100.0);
            connection.close();
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to, double amount)
        throws Exception {
            // Создание Statement
            CallableStatement stmt
                    = connection.prepareCall("{call TransferAmount(?,?,?)}");
            // Установка параметров
            stmt.setLong(1, from);
            stmt.setLong(2, to);
            stmt.setDouble(3, amount);
            // Выполнение процедуры
            stmt.execute(); 
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class TransactionalSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            // Ручное управление транзакциями
            connection.setAutoCommit(false);
            
            try {
                transferAmount(2, 1, 10.0);
            } finally {
                connection.close();
            }
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to,
                double amount) throws Exception {
            PreparedStatement stmt = null;
            Statement query = null;
            try {
                stmt = connection.prepareStatement
                ("update ACCOUNT set AMOUNT=AMOUNT+? where ID=?");
                // Забираем сумму со счета плательщика
                stmt.setDouble(1, -amount);
                stmt.setLong(2, from);
                stmt.execute();
                
                // Добавляем сумму на счет получателя
                stmt.setDouble(1, amount);
                stmt.setLong(2, to);
                stmt.execute();
                
                // Пост-проверка: отрицательность счета плательщика
                query = connection.createStatement();
                ResultSet rs = query.executeQuery(
                        "select AMOUNT from ACCOUNT where ID="+from+" and AMOUNT<0");
                if (rs.next()) {
                    throw new Exception("На счете №"+from+" 
                    недосточно средств ["+(amount+rs.getDouble(1))+"] 
                    для снятия суммы ["+amount+"]");
                }
                connection.commit();
                System.out.println("Перечисление средств успешно выполнено");
            } catch(Exception e) {
                e.printStackTrace();
                connection.rollback();
            } finally {
                if (stmt!=null)
                    stmt.close();
                if (query!=null)
                    query.close();
            }
        }
        
    }

    Работа с базами данных из J2EE Web-контейнера

    Презентация

    Объектно-реляционное отображения для работы с базами данных

    Презентация

    Использование препроцессора для работы с API СУБД

    Презентация

    Вернуться к учебному плану