英文:
HSQDLDB throws ArrayIndexOutOfBoundsException: when encrypted DB is introduced
问题
//java code in netbeans
//Registering the HSQLDB JDBC driver and getting connection
Class.forName("org.hsqldb.jdbc.JDBCDriver");
con = DriverManager.getConnection("jdbc:hsqldb:file:C:\\Users\\PC\\mydb_fileencr;crypt_key=3f302916463bf54b10f5fc2b810ca43d;crypt_type=AES", "SA", "");
//creation of table
String sqlCreateTable = "CREATE TABLE PM (id INTEGER IDENTITY PRIMARY KEY, name varchar (500), submission_date date, file blob)";
//insertion code
String sqlInsert = "INSERT INTO PM (name, submission_date, file) VALUES (?, ?, ?)";
//values
pstmt = con.prepareStatement(sqlInsert);
String name = "John";
pstmt.setString(1, name);
pstmt.setDate(2, getCurrentDate());
pstmt.setBinaryStream(3, input); //the file is 1.3MB zip file and working fine
try {
result = pstmt.executeUpdate();
} catch (java.sql.SQLException sq) {
sq.printStackTrace();
}
//this code works fine within netbeans process when encryption key is not introduced in jdbc url.
//key is obtained by CALL CRYPT_KEY('AES', null); in hsqldb gui
//and the exception is
Connection created successfully
INSERT INTO PM (name, submission_date, file) VALUES (?, ?, ?)
java.sql.SQLException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at test.HSQLConnectDB.insert(HSQLConnectDB.java:130)
at test.HSQLConnectDB.main(HSQLConnectDB.java:168)
query executed 0
Caused by: org.hsqldb.HsqlException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SessionData.allocateLobForResult(Unknown Source)
at org.hsqldb.Session.allocateResultLob(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.performPreExecute(Unknown Source)
... 4 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.persist.LobManager.deflate(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBACompressedPart(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBACompressed(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBA(Unknown Source)
at org.hsqldb.persist.LobManager.setBytes(Unknown Source)
at org.hsqldb.SessionData.allocateBlobSegments(Unknown Source)
... 7 more
Please note that this code is a direct translation of the provided Java code into Chinese. Let me know if you need any further assistance or clarification.
英文:
//java code in netbeans
//Registering the HSQLDB JDBC driver and getting connection
Class.forName("org.hsqldb.jdbc.JDBCDriver");
con = DriverManager.getConnection("jdbc:hsqldb:file:C:\\Users\\PC\\mydb_fileencr;crypt_key=3f302916463bf54b10f5fc2b810ca43d;crypt_type=AES", "SA", "");
//creation of table
String sql = "CREATE TABLE PM (id INTEGER IDENTITY PRIMARY KEY, name varchar (500), submission_date date , file blob )";//PRIMARY KEY (id);
//insertion code
String sql = "INSERT INTO PM (name , submission_date , file ) values (?,?,?)";//PRIMARY KEY (id)
//values
pstmt = con.prepareStatement(sql);
String name = "John";
pstmt.setString(1, name);
pstmt.setDate(2, getCurrentDate());
pstmt.setBinaryStream(3, input); //the file is 1.3MB zip file and working fine
try {
result = pstmt.executeUpdate();
} catch (java.sql.SQLException sq) {
sq.printStackTrace();
}
//this code works fine within netbeans process when encryption key is not introduced in jdbc url.
//key is obtained by CALL CRYPT_KEY('AES', null); in hsqldb gui
//and the exception is
Connection created successfully
INSERT INTO PM (name , submission_date , file ) values (?,?,?)
java.sql.SQLException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at test.HSQLConnectDB.insert(HSQLConnectDB.java:130)
at test.HSQLConnectDB.main(HSQLConnectDB.java:168)
query executed 0
Caused by: org.hsqldb.HsqlException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SessionData.allocateLobForResult(Unknown Source)
at org.hsqldb.Session.allocateResultLob(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.performPreExecute(Unknown Source)
... 4 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 528384
at org.hsqldb.persist.LobManager.deflate(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBACompressedPart(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBACompressed(Unknown Source)
at org.hsqldb.persist.LobManager.setBytesBA(Unknown Source)
at org.hsqldb.persist.LobManager.setBytes(Unknown Source)
at org.hsqldb.SessionData.allocateBlobSegments(Unknown Source)
... 7 more
Code is written in java using Netbeans. Also i want to ask, if i insert data in hsqldb using file mode:my specified directory and also insert data using hsqldb GUI, then conflict occurs and multiple exceptions are raised but anyways my preference is to check how encryption is applied in hsqldb. please help if some "complete" sample code is available
答案1
得分: 1
如果您使用最新版本2.5.1并创建新数据库,您无需在连接URL中使用crypt_lobs=true
(它会自动完成)来加密LOB文件。ArrayindexOutOfBoundsException
是由一个在版本2.5.1中已修复的错误引起的。如果您发现任何问题,您可以报告给HSQLDB项目。
关于crypt_lobs=false
的建议适用于使用较旧版本的HSQLDB创建的数据库,不适用于新数据库。对于新数据库和最新版本,您根本不需要设置此属性。
英文:
If you use the latest version 2.5.1 and create a new database, you do not need to use crypt_lobs=true
in your connection URL (it is done automatically) to encrypt the lob files. The ArrayindexOutOfBoundsException
was due to a bug that has been finxed in version 2.5.1. If you find any issue, you can report for the HSQLDB project.
The advice given about crypt_lobs=false
is for databases created using much older versions of HSQLDB and does not apply to new databases. With new databases and the latest versions, you do not need to set this property at all.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论