Вопрос по maven, java – Блокировка базы данных Oracle до запуска сценариев удаления / загрузки данных

2

мы проводим тесты Junit и Selenium от CI каждую полночь. Мы предварительно заполняем данные с помощью плагина Maven-SQL следующим образом.

          <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sql-maven-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>create-database-tables</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <autocommit>false</autocommit>
                            <onError>continue</onError>
                            <srcFiles>
                                <srcFile>../sql/delete_data.sql</srcFile>
                                <srcFile>../sql/load_data.sql</srcFile>
                            </srcFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

мы часто сталкиваемся с тупиками БД из-за одновременных сборок разных пользователей. Решение, которое мы подумали, заключается в блокировке базы данных перед запуском сценариев БД.

Можем ли мы заблокировать доступ к БД перед запуском скриптов и разблокировать его после запуска скриптов.

4 команды работают над этим проектом. Из-за проблем со связью они работают одновременно. Anil Kumar C
Возникают ли взаимоблокировки из-за того, что несколько пользователей одновременно запускают вышеуказанный код? Rene

Ваш Ответ

3   ответа
0

Что вы могли бы сделать, это следующее:

При запуске скрипта попробуйте заблокировать таблицу.

lock table <some_table> in exclusive mode nowait;

Это будет успешным, только если ни один другой процесс не заблокирован этой таблицей. Если это не удается, другой процесс уже запущен.

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

Также убедитесь, что вы заблокировали таблицу, которая существует с единственной целью иметь что-то для блокировки, чтобы исключительно запускать ваши скрипты.

0

Это действительно зависит от того, как вы используете базу данных. Если разные пользователи разные пользователи оракула, не должно быть никаких проблем, так как каждый пользователь может иметь свои собственные таблицы и не должен мешать друг другу.

Если каждый пользователь подключается к одному и тому же пользователю Oracle, возможен конфликт. Если для каждого теста требуется эксклюзивный доступ ко всем ресурсам, вы можете создать контрольную таблицу, которая контролирует, кому разрешен доступ, а кому - нет. Это должно быть закодировано на этапах подготовки и окончания теста, чтобы быть эффективными. Простая вставка в таблицу и проверка того, является ли ваш Вставка была первой, что можно было сделать. Использование dbms_lock также является аналогичной опцией.

Другой способ - использовать Oracle Resource Manager с максимальным пределом сеанса, установленным в 1, для учетной записи базы данных Oracle, которая используется для запуска эксклюзивных тестов. При этом каждому соединению запрещается до тех пор, пока слот подключения не станет снова доступным после отключения тестового пользователя.

2

Совместная база данных для тестирования никогда не является отличной идеей, вероятно, вы это знаете, поэтому вы спрашиваете, как ограничить доступ для одного пользователя за раз.

Проповедь в стороне ... Я хотел бы предложить левостороннее решениеLiquiBase управлять как схемой базы данных, так и совокупностью данных. Имеет множество полезных функций, одна из которых заключается в том, что он автоматически блокирует базу данных и предотвращает взаимное влияние двух экземпляров жидкостной базы.

Example

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myspotontheweb.db</groupId>
    <artifactId>liquibase-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <!-- Liquibase settings -->
        <liquibase.url>jdbc:h2:target/db1/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
        <liquibase.driver>org.h2.Driver</liquibase.driver>
        <liquibase.username>user</liquibase.username>
        <liquibase.password>pass</liquibase.password>
        <liquibase.changeLogFile>com/myspotontheweb/db/changelog/db-changelog-master.xml</liquibase.changeLogFile>
        <liquibase.promptOnNonLocalDatabase>false</liquibase.promptOnNonLocalDatabase>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.162</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>2.0.2</version>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>update</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Похожие вопросы