Derby嵌入式数据库多连接访问配置问题求助
问题解决方案整理
一、解决java.lang.SecurityException: sealing violation错误
这个错误是类路径中存在重复或版本冲突的Derby jar包导致的,按以下步骤排查:
- 检查项目依赖:右键NetBeans项目→属性→库,确保只引入一套Derby相关jar(通常是
derby.jar、derbytools.jar,不要同时混合不同版本或嵌入式/网络版的Derby包) - 清理项目缓存:执行右键项目→Clean and Build,手动删除项目下的
build和dist目录后重新编译 - 检查系统类路径:查看JRE的
lib/ext目录是否有Derby相关jar,如有则删除,避免全局类加载冲突
二、TRANSACTION_READ_COMMITTED隔离级别生效验证
Derby默认隔离级别就是TRANSACTION_READ_COMMITTED,但要确保设置时机正确:
- 必须在创建
Statement/PreparedStatement之前调用con.setTransactionIsolation(TRANSACTION_READ_COMMITTED) - 确保连接处于非自动提交模式:调用
con.setAutoCommit(false),执行数据库操作后手动con.commit()或con.rollback() - 验证方式:执行
SELECT CURRENT_TRANSACTION_ISOLATION FROM SYSIBM.SYSDUMMY1查看当前会话的隔离级别
三、行级锁配置生效方法
Derby行级锁需要满足多个条件,按以下步骤调整:
- 确认数据库属性已生效:执行SQL
VALUES SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY('derby.storage.rowLocking'),返回'true'才说明配置成功;若未生效,关闭所有数据库连接后重新执行CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.rowLocking', 'true')并提交 - 启用多用户连接模式:数据库连接URL需指定用户密码,格式为
jdbc:derby:your_db_name;create=true;user=db_user;password=db_pass,确保多个程序使用相同URL连接 - 显式触发行级锁:普通SELECT是快照读不会加锁,需要执行
SELECT ... FOR UPDATE来获取行锁;更新/删除操作会自动在目标行上加锁 - 确保事务处于非自动提交状态:只有在
autoCommit=false的事务中,行锁才会保持到事务提交/回滚
内容的提问来源于stack exchange,提问作者JT20
相关产品推荐
相关产品推荐

