我正在一个数据库应用程序上工作,该应用程序大部分是只读的,但是有一个表记录应用程序中用户的移动并对其进行大量写入。对于每几千次写入,我们在错误日志中看到一些异常,如下所示:
[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)
有问题的表具有以下架构:
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;
以及对应的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>
尽管我们不太可能,但我们的web应用程序的多个实例可能一次写入数据库,因为我们在webapp上下文中对版本号进行了编码,以无缝发布应用程序的新版本。因此,使用旧版本应用程序缓存在其Web浏览器中的客户端将访问服务器的旧版本,我们将在数周后取消部署该服务器。
无论如何,我不相信这是问题所在,但是我怀疑这里的MySQL和Hibernate之间存在一些同步问题。将生成器更改为sequence,seqhilo或hilo会有所帮助吗?另外,如果您可以提供在MySQL中设置此类生成器的示例,那将非常有帮助,因为大多数在线资源都只是从Hibernate手册中极简主义的示例中复制粘贴而来。
如果您有多个进程在同一张表中写入数据,那么增量肯定是不好的-势必会发生冲突。
由于我们正在谈论的是MySQL,因此最容易使用的是identity
。在您的Hibernate映射中:
<generator class="identity"/>
在您的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;
更改现有表:
ALTER TABLE `my_table`
CHANGE COLUMN `id` `id` int(11) NOT NULL AUTO_INCREMENT=$NEW_VALUE$;
其中$ NEW_VALUE $应该用下一个可用ID替换,这样顺序就不会重置为1。
问题内容: 我正在使用PHP。 请问什么是将新记录插入具有唯一字段的数据库的正确方法。我正在批量插入很多记录,我只想插入新记录,并且我不想重复条目有任何错误。 有没有唯一方法可以首先进行SELECT并查看条目是否在INSERT之前已经存在-并且仅在SELECT不返回任何记录时才插入INSERT?我希望不是。 我想以某种方式告诉MySQL忽略这些插入而没有任何错误。 谢谢 问题答案: 如果在重复记录
我通过从html表单发送值来测试我的数据库。独特的插入是好的,连接是好的。我的问题是,当我故意发送一个重复的(用户名)时--再次出于测试目的,我会得到一条错误消息。太完美了! null 明确地说,我的目标是将密钥'username'发送回客户机表单,以表明他的用户名已被使用。我将不得不做同样的电子邮件稍后也,因此我想要钥匙。 编辑:我认为我必须使用带有GET诊断的存储过程。与本文类似。
而我正在做一个简单的密码程序。我遇到了这个错误 嗯,我不太清楚原因是什么。我需要一些老手的帮助@@下面是我的代码。
每次运行我的代码时,我都会从Cron那里得到以下错误,看起来它来自DateTime,是DateTime有错误还是我没有正确使用它。错误的第24行是这样的:- 我在$datetrue中给DateTime的是2014-06-13 13:00:00 致命错误:未捕获异常“exception”,消息为“DateTime::u construct():无法分析位置11(2)处的时间字符串(2014-06-1
谢谢,罗伯
HTTP状态500-请求处理失败;嵌套异常是org.springframework.dao.dataIntegrityViolationException:键“groups_groupid”的重复条目“2”;SQL[N/A];约束[null];嵌套异常是org.hibernate.exception.constraintViolationException:键“groups_groupid”的重复