嵌入式Derby / Java DB中的自动增量错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了嵌入式Derby / Java DB中的自动增量错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2097字,纯文字阅读大概需要3分钟。
内容图文
![嵌入式Derby / Java DB中的自动增量错误](/upload/InfoBanner/zyjiaocheng/795/4d06e9e2614c427dba10b53837c9c124.jpg)
我正在开发一个在嵌入模式下使用Apache Derby数据库的会计程序.我有一个包含两列的表格分支:
CREATE TABLE Branch(
idBranch INT NOT NULL PRIMARY KEY
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
place VARCHAR(255) NOT NULL
);
当我在分支表中插入新记录时,自动增量1不能正常工作.
我得到以下结果:
+----------+
| idBranch |
+----------+
| 1 |
| 101 |
| 201 |
| 301 |
+----------+
但结果应该如下:
+----------+
| idBranch |
+----------+
| 1 |
| 2 |
| 3 |
| 4 |
+----------+
以下是我连接数据库的方法:
private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
public static Connection createConnection() {
Connection connection = null;
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection("jdbc:derby:" + DATABASE);
} catch (ClassNotFoundException ex) {
logger.log(Level.SEVERE, "JDBC Driver not loaded!", ex);
System.exit(1);
} catch (SQLException ex) {
// create the database
DerbyDB derbyDB = new DerbyDB();
connection = derbyDB.create();
}
return connection;
}
以下是在Branch表中插入新记录的方法:
private static final String CREATE_QUERY = "INSERT INTO Branch(place) VALUES(?)";
public int createBranch(Branch branch) {
Connection connection = DerbyDAOFactory.createConnection();
try {
PreparedStatement statement = connection.prepareStatement(CREATE_QUERY, Statement.RETURN_GENERATED_KEYS);
statement.setString(1, branch.getPlace());
statement.execute();
ResultSet result = statement.getGeneratedKeys();
if(result.next()) {
return result.getInt(1);
}
} catch (SQLException ex) {
logger.log(Level.SEVERE, null, ex);
}
return -1;
}
为什么我得到这个结果?
解决方法:
您观察的序列是此错误的结果:https://issues.apache.org/jira/browse/DERBY-5151
以下文档描述了它发生的原因:https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html
总结一下……
生成的值是预先分配的(默认情况下一次100个值).当数据库被错误地关闭时,这些预先分配的值被泄露 – 它们被简单地丢弃,当数据库再次启动时,分配器开始计算它停止的位置(在序列中引入间隙).
换句话说,这是预期的行为 – 避免它确保您以有序的方式关闭数据库:
DriverManager.getConnection("jdbc:derby:;shutdown=true")
内容总结
以上是互联网集市为您收集整理的嵌入式Derby / Java DB中的自动增量错误全部内容,希望文章能够帮你解决嵌入式Derby / Java DB中的自动增量错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。