Nik*_*man 7 mysql hibernate mysql-error-1062
我正在开发一个大多数只读的数据库应用程序,但是有一个表记录用户在应用程序中的移动并且有大量的写入.对于每几千次写入,我们在错误日志中看到一些例外,如下所示:
[WARN][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] SQL Error: 1062, SQLState: 23000
[ERROR][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] Duplicate entry '17011' for key 1
[ERROR][2009-07-30 11:09:20,083][org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
Run Code Online (Sandbox Code Playgroud)
有问题的表具有以下模式:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int(11) NOT NULL,
`data1` int(11) NOT NULL,
`data2` int(11) NOT NULL,
`timestamp` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)
和相应的Hibernate映射XML:
<hibernate-mapping>
<class name="mycorp.MyClass" table="my_table">
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"/>
</id>
<property name="data1" column="data1" type="java.lang.Integer"/>
<property name="data2" column="data2" type="java.lang.Integer"/>
<property name="timestamp" column="timestamp" type="java.util.Date"/>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
虽然不太可能,但我们的webapp的多个实例可能会立即写入数据库,因为我们在webapp上下文中对数字进行版本化以无缝地发布新版本的应用程序.具有在其Web浏览器中缓存的旧版本应用程序的客户端将访问旧版本的服务器,我们将在几周后取消部署.
无论如何,我不相信这是问题所在,但我怀疑MySQL和Hibernate之间存在一些同步问题.将我的发电机更改为顺序,seqhilo或hilo会有帮助吗?此外,如果您可以提供在MySQL中设置此类生成器的示例,那将非常有用,因为大多数在线资源都是从Hibernate手册中的极简主义示例中简单地复制粘贴的.
Chs*_*y76 10
如果你有多个进程写入同一个表,增量肯定是坏的 - 你一定会发生冲突.
因为我们正在谈论MySQL,所以最容易使用的是identity.在你的Hibernate映射中:
<generator class="identity"/>
Run Code Online (Sandbox Code Playgroud)
在你的MySQL脚本中:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data1` int(11) NOT NULL,
`data2` int(11) NOT NULL,
`timestamp` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)
要更改现有表:
ALTER TABLE `my_table`
CHANGE COLUMN `id` `id` int(11) NOT NULL AUTO_INCREMENT=$NEW_VALUE$;
Run Code Online (Sandbox Code Playgroud)
其中$ NEW_VALUE $应替换为下一个可用的id,以便序列不会重置为1.
| 归档时间: |
|
| 查看次数: |
18931 次 |
| 最近记录: |