无法删除Apache Derby嵌入式数据库系统目录

阿德里安·艾尔德(Adrian Elder)

在退出使用时,Derby无法删除系统目录drop=true

这是我面临的挑战的最小示例:

package derbytest;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author aelder
 */
public class DerbyTest {

    private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
    private static final String CONN_URL = "jdbc:derby:EmbeddedDBAudit";

    private static File databaseFile;
    private static final String USER_HOME_DIR = System.getProperty("user.home", ".");

    public static Connection getConnection(boolean createDatabase) throws SQLException {
        return DriverManager.getConnection(CONN_URL + (createDatabase ? ";create=true" : ""));
    }

    public static void shutdownConnectionAndCleanup() {
        try {
            DriverManager.getConnection(CONN_URL + ";drop=true");
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("08006")) {
                ex.printStackTrace();
            }
        }
    }

    public static void setDerbyHome() {
        setDatabaseFile("");

        int index = 1;
        while (databaseFile.exists()) {
            setDatabaseFile(String.valueOf(index++));
        }

        // Set the db system directory.
        System.setProperty("derby.system.home", databaseFile.getAbsolutePath());
    }

    private static void setDatabaseFile(String auditFolderCount) {
        String databaseFilePATH = USER_HOME_DIR + File.separator + ".EmbeddedDBAudit" + auditFolderCount;

        databaseFile = new File(databaseFilePATH);
        databaseFile.deleteOnExit();
    }

    public static void initDerbyHomeAndDriver() {
        setDerbyHome();

        initDerbyDriverInstance();
    }

    public static void initDerbyDriverInstance() {
        try {
            Class.forName(DRIVER).newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
            Logger.getLogger(DerbyTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static boolean tableAlreadyExists(SQLException e) {
        return e.getSQLState().equals("X0Y32");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            initDerbyHomeAndDriver();
            getConnection(true);
            shutdownConnectionAndCleanup();
        } catch (SQLException ex) {
            Logger.getLogger(DerbyTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

当我运行它时,我得到:

java.sql.SQLException: Directory EmbeddedDBAudit cannot be removed.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
    at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
    at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(Unknown Source)
    at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
    at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
    at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    at derbytest.DerbyTest.shutdownConnectionAndCleanup(DerbyTest.java:34)
    at derbytest.DerbyTest.main(DerbyTest.java:104)
Caused by: ERROR XBM0I: Directory EmbeddedDBAudit cannot be removed.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.services.monitor.Monitor.removePersistentService(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection$6.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.derby.impl.jdbc.EmbedConnection.removePersistentService(Unknown Source)
    ... 12 more

该代码尝试将计数器附加到系统目录的末尾,以便可以同时运行使用嵌入式数据库的程序的多个实例。

预期的行为:调用user.home/.EmbeddedDBAudit时应删除在创建的文件夹drop=true

布莱恩·彭德尔顿

您看到的行为是记录的行为。

drop=true 仅用于内存数据库,而不用于持久数据库。

请参阅:http : //db.apache.org/derby/docs/10.14/ref/rrefattribdrop.html

如果使用非内存数据库的数据库指定此属性,则Derby会生成SQLException XBM0I。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法删除嵌入式数据库的Derby系统目录

无法使用 JPA 获得与数据库的连接 - 缺少 derby 嵌入式驱动程序类

如何在 Dropwizard 项目(Angular 7 前端)中创建和开始使用嵌入式 Apache Derby 数据库

无法创建嵌入式 h2 数据库

无法为我的嵌入式数据库设置身份验证和授权

Spring Boot:无法确定数据库类型NONE的嵌入式数据库驱动程序类

Derby 嵌入式数据库奇怪的行为,SQLSyntaxErrorException

.Net客户端无法访问嵌入式Firebird数据库服务器

运行jar时无法确定数据库类型NONE的嵌入式数据库驱动程序类

无法在 Spring Boot 中使用 Redis 确定数据库类型 NONE 的嵌入式数据库驱动程序类

Spring Boot-无法确定数据库类型NONE的嵌入式数据库驱动程序类

Apache Drill嵌入式和分布式系统

NetBeans在哪里创建Derby嵌入式数据库

连接到嵌入式Derby数据库时出现java.lang.NoClassDefFoundError

derby 嵌入式数据库不采用 application.properties 的路径

Java嵌入式数据库(java db / derby)连接管理

Firebird嵌入式安装问题:无法确定库

在嵌入式驱动程序中运行的Derby数据库是否存在内存限制?

以后是否可以在客户端-服务器db环境中使用嵌入式Derby数据库?

无需完全重新安装即可重建IBM Portal嵌入式Derby数据库

无法从目录中删除图像,但数据成功从codeigniter中的数据库中删除

Swift Xcode无法从项目中删除嵌入式二进制文件/链接的框架和库

Java嵌入式库磁盘键值数据库

Apache Derby-检查数据库是否已创建?

在Apache Derby数据库中声明外键

SQLIte数据库无法删除条目

无法删除sqlite数据库

无法删除Azure SQL数据库

无法从数据库删除行