2009-07-30 10 views
7

Çoğunlukla salt okunur bir veritabanı uygulaması üzerinde çalışıyorum, ancak uygulamadaki kullanıcı hareketlerini kaydeden ve buna yazma sayıda olan bir masa var. her birkaç bin yazar için, şöyle hata günlüğünde birkaç istisna bkz:Hazır giriş hatalarını Hazırda bekletme, MySQL tarafından suçlanıyor mu?

[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) 

Söz konusu tablo aşağıdaki şema vardır:

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; 

Ve tekabül hazırda haritalama 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> 

Webapp'ımızın birden çok örneği, webapp içeriğindeki sürümlerin sürümlerini sorunsuz bir şekilde serbest bırakmak için veritabanımıza bir kerede yazabiliyor olabilir. uygulamaların rasyonları. Web tarayıcısında önbelleğe alınan uygulamanın eski sürümüne sahip olan istemciler, sunucunun eski sürümlerine erişebiliyor, bu da birkaç hafta sonra çözülüyor.

neyse, ben bu sorun olduğunu ikna değilim ama MySQL arasında bazı senkronizasyon sorunu olduğunu şüpheli kulüpler ve burada el altında Hibernate. Jeneratörümü sekans, seqhilo veya hilo yardımı olarak mı değiştirecek? Eğer MySQL böyle bir jeneratör kurma örneği verebilirseniz kaynaklar online en basit hazırda kılavuzda acı minimalist örneklerden kopya-yapıştırılan olarak Ayrıca, yani çok yararlı olacaktır. Aynı tabloya birden fazla işlem yazma varsa

cevap

9

Artış kesinlikle kötü - Eğer çarpışmalar uğrarsınız. o bahsettiğimizi MySQL olduğundan

, kullanımı kolay şey identity olurdu. MySQL komut dosyasında

<generator class="identity"/> 

: sizin hazırda haritalama olarak

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; 

varolan tabloyu değiştirmek için:

ALTER TABLE `my_table` 
    CHANGE COLUMN `id` `id` int(11) NOT NULL AUTO_INCREMENT=$NEW_VALUE$; 
$ NEW_VALUE $ sonraki kullanılabilir id değiştirilmesi gerektiğini

yüzden bu sekans 1.

+0

Çok kapsamlı ve net cevaba sıfırlanmaz - teşekkürler! –