2016-12-08 3 views
1

Ich habe eine Anwendung, die auf zwei Servern ausgeführt wird und beide diese Server über Hibernate auf dieselbe Datenbank zugreifen. Das Problem hier ist, wenn diese beiden Anwendungen große Datenmengen verarbeiten und versuchen, in die gleiche Tabelle einzufügen. Es kommt zu einer primären Schlüsselverletzung. Und von den Dingen, die ich bemerkt habe, scheint Hibernate eine Anzahl von Primärschlüssel-IDs zu puffern. z.B. Wenn Server A Daten in die ID 100 einfügt und gleichzeitig Server B in die ID 200 einfügt. Ich denke, dieses Problem hängt mit dem oben genannten Szenario zusammen. Es folgt meine Hibernate EigenschaftenHibernate-Primärschlüsselverletzung auf zwei Serverinstanzen

 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dbtest?autoReconnect=true</property> 

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">password</property> 
    <!--  <property name="hibernate.show_sql">true</property>--> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <!-- 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    --> 
    <property name="hibernate.use_sql_comments">true</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property> 
    <property name="hibernate.connection.isolation">2</property> 
    <property name="hibernate.default_schema">dbtest</property> 
    <property name="hibernate.jdbc.batch_size">50</property> 
    <!--c3po connection pooling --> 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 

Dies ist die Einheit, die

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Sep 3, 2014 4:38:39 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="com.test.dto.AdditionalContacts" table="additional_contacts" 
      entity-name="additionalcontacts"> 
     <id name="contactId" type="java.lang.Integer" column="contactId"> 
      <generator class="increment" /> 
     </id> 
     <property name="contactGuid" type="java.lang.String"> 
      <column name="contactGuid" /> 
     </property> 
     <property name="contactName" type="java.lang.String"> 
      <column name="contactName" /> 
     </property> 
     <property name="salutation" type="java.lang.String"> 
      <column name="salutation" /> 
     </property> 
     <property name="EmailAddress" type="java.lang.String"> 
      <column name="email" /> 
     </property> 
     <property name="includeInEmails" type="java.lang.Boolean"> 
      <column name="includeInEmails" /> 
     </property> 
     <property name="Website" type="java.lang.String"> 
      <column name="website" /> 
     </property> 
     <property name="city" type="java.lang.String"> 
      <column name="city" /> 
     </property> 
     <property name="state" type="java.lang.String"> 
      <column name="state" /> 
     </property> 
     <property name="postCode" type="java.lang.String"> 
      <column name="postCode" /> 
     </property> 
     <property name="country" type="java.lang.String"> 
      <column name="country" /> 
     </property> 
     <property name="street" type="java.lang.String"> 
      <column name="street" /> 
     </property> 
     <property name="streetLine1" type="java.lang.String"> 
      <column name="streetLine1" /> 
     </property> 
     <property name="streetLine2" type="java.lang.String"> 
      <column name="streetLine2" /> 
     </property> 
     <property name="streetLine3" type="java.lang.String"> 
      <column name="streetLine3" /> 
     </property> 
     <property name="streetLine4" type="java.lang.String"> 
      <column name="streetLine4" /> 
     </property> 
     <property name="phone1" type="java.lang.String"> 
      <column name="phone1" /> 
     </property> 
     <property name="phone2" type="java.lang.String"> 
      <column name="phone2" /> 
     </property> 
     <property name="phone3" type="java.lang.String"> 
      <column name="phone3" /> 
     </property> 
     <property name="fax" type="java.lang.String"> 
      <column name="fax" /> 
     </property> 
     <property name="location" type="java.lang.String"> 
      <column name="location" /> 
     </property> 
     <property access="field" column="createDate" insert="true" 
        name="createDate" update="false" /> 
     <property access="field" column="modifyDate" insert="true" 
        name="modifyDate" update="true" /> 
    </class> 
</hibernate-mapping> 

Und nach ist das Unternehmen versagt, die über Unternehmen verwendet

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Sep 3, 2014 4:38:39 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="com.test.dto.Contacts" table="contact" 
      entity-name="contact"> 
     <id name="cGuid" type="java.lang.String"> 
      <column name="contactGuid" /> 
     </id> 
     <property name="org" type="java.lang.Integer"> 
      <column name="org" /> 
     </property> 
     <property name="Name" type="java.lang.String"> 
      <column name="name" /> 
     </property> 
     <property name="FirstName" type="java.lang.String"> 
      <column name="firstName" /> 
     </property> 
     <property name="LastName" type="java.lang.String"> 
      <column name="lastName" /> 
     </property> 
     <property name="abn" type="java.lang.String"> 
      <column name="abn" /> 
     </property> 
     <property name="active" type="java.lang.Boolean"> 
      <column name="active" /> 
     </property> 
     <property access="field" column="createDate" insert="true" 
        name="createDate" update="false" /> 
     <property access="field" column="modifyDate" insert="true" 
        name="modifyDate" update="true" /> 

     <bag name="additionalContactList" table="additional_contact" lazy="false" inverse="true" 
      cascade="all"> 
      <key> 
       <column name="contactGuid" not-null="true" /> 
      </key> 
      <one-to-many entity-name="additionalcontacts" 
         class="com.test.dto.AdditionalContact" /> 
     </bag> 
    </class> 
</hibernate-mapping> 

Dieses auf

versagt

cascade = "alle"

+0

Fügen Sie die Hibernate-Zuordnung für das Objekt hinzu, das Sie einfügen möchten – Adam

+0

Welche Art von ID wird eingefügt? – Adam

+0

Was ist Ihre ID-Generierungsstrategie? – diufanman

Antwort

2

Sie müssen AUTO_INCREMENT verwenden. Auf diese Weise verwaltet MySQL die Erstellung von IDs, sodass die Server nicht synchronisiert werden müssen. Ändern Sie die DB-Spalte in AUTO_INCREMENT. In Hibernate den Generatortyp auf native ändern.

Andere Alternativen wäre UUID als Primärschlüssel zu verwenden.

Neuere Versionen von Hibernate haben andere Generatoren, die besser als native sind.