我正在创建一个带有嵌入式H2数据库的JavaFX程序,该程序将用于处理用户登录名和密码。使用Intellij Ultimate,我有一个可以从工具栏运行的数据库。另外,几乎可以肯定我拥有正确的JDBC驱动程序和URL。该数据库可以从Intellij的数据库控制台正常运行。当我尝试使用Java代码访问数据库时,发生错误。我正在使用数据库类来处理数据库连接。
我收到JdbcSQLNonTransientException
,一般错误:
非法状态异常:无法读取位置上的页面
由以下原因引起:java.lang.IllegalStateException:不支持的类型17。
我的编译器中显示的代码行,导致错误:
Connection conn = DriverManager.getConnection(DB_URL, "sa", "");
我尝试到处都找到类似的问题,但是找不到相关的问题。我尝试过尽可能简化我的班级,以找出问题并简单地建立连接。我删除了我的项目,并尝试重新开始。
产生问题的简化DatabaseManager
类:
public class DatabaseManager {
static final String JDBC_DRIVER = "org.h2.Driver";
static final String DB_URL = "jdbc:h2:D:/trant/Documents/Java Practice/Order A Car2/res/userDatabase";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection(DB_URL, "sa", "");
Statement st = conn.createStatement();
st.executeUpdate("SELECT * FROM JOBS");
conn.close();
}
}
我希望连接到H2数据库并从表“ JOBS”中检索数据。该代码未出现上述错误。
编辑:如果我使用的是H2的版本1.4.199
,而不是1.4.200
,那么问题就消失了。我在这里发现了几乎相同的问题:https://github.com/h2database/h2database/issues/2078。该链接具有与我相同的堆栈跟踪。我尚未解决版本1.4.200
答案 0 :(得分:1)
https://github.com/h2database/h2database/issues/2078 您应该使用相同的驱动程序,因此在对1.4.196(IDEA使用)进行修改后,无法使用1.4.200(当前的弹簧数据版本)进行读取。因此,我的崩溃情况是使用驱动程序1.4.196在IDEA中打开了db,而spring应用程序代码使用了1.4.200。因此它不会再次开始。您可以在pom.xml中为您的应用程序声明1.4.196版本,但是看来您将被绑定到该版本,并且我不知道如何完全修复数据库。
答案 1 :(得分:0)
您确实应该提供完整的堆栈跟踪信息,而不仅仅是此类问题中的错误消息。
您看到的消息不是编译错误。
通常这样的消息表示您的数据库已损坏。如果不需要任何数据,只需删除其所有文件并从头开始重新创建即可。
如果可以通过某些工具打开数据库,但无法从应用程序中打开数据库,请检查两个地方使用的H2版本并对齐。您可以使用SCRIPT TO 'filename.sql'
命令以适用于SQL脚本的版本导出数据库,并使用该脚本将数据填充到新数据库中,以确保它没有损坏(使用您喜欢的版本)。 / p>
答案 2 :(得分:0)
@Yura已经指出,您需要确保所有代码库和所有工具都使用相同版本的驱动程序,无论是1.4.196还是1.4.200。
接下来,如果您的数据库中没有任何有价值的东西,则可以安全地删除该db文件,然后将重新创建该文件。
如果您有一些有价值的数据并且没有备份,那么修复数据库可能是一个任务,不一定成功...
如果您有备份,那么“ backup-to-sql-using-196”和“ restore-from-sql-using-200”过程最有可能为您完成这项工作,请参见{{ 3}} ...
答案 3 :(得分:0)
首先,您必须将数据库副本保存在安全的地方。
将新副本复制到项目中以避免任何损坏,请确保不要尝试使用inteliJ打开它。
转到数据源和驱动程序->驱动程序-> H2->驱动程序文件,将其更改为1.4.196。 创建类型为h2的新数据源,并填写字段
用户:“ sa”
密码:“”(空)
网址采用这种形式(您的数据库文件的路径)
jdbc:h2:file:D:\Downloads\loans\loans\Database
然后单击测试连接,它应该显示绿色消息。应用并关闭。
在编辑器的数据库视图中右键单击数据库,然后单击“打开查询控制台”。运行此行(您要转储数据库的链接)
SCRIPT TO 'D:\Downloads\loans\loans\db-dump.sql'
创建一个新的数据库文件(Test.mv.database),按照前面的步骤操作,并将驱动程序版本更改回1.4.200。这次以相同的步骤创建一个新的数据源,链接到您的新数据库
jdbc:h2:file:D:\Downloads\loans\loans\Test
测试连接,应用并关闭。
打开查询控制台,然后从db-dump.sql复制粘贴脚本并运行它。在数据库视图中右键单击数据库,然后单击“刷新”。您应该看到数据。再次右键单击,然后单击“断开连接”。
确保您的application.properties文件指向正确的数据库(测试)并运行您的应用程序。
答案 4 :(得分:-1)
首先启动h2数据库,然后启动应用程序。