2017-01-16 5 views
0

私はバウンダリの挿入と更新を有効にしようとしていましたが、影響を及ぼさなかったパラメータをどこに置いても問題ありませんでした。 My Springの設定はほとんどがXMLです。我々はSpring 4.3.4Hibernate 5.2.5Spring Data 1.10.5を使用している、とMySQL Connector 5.1.38Spring 4.3.4とHibernate 5.2.5でhibernateにパラメータを渡す方法

わたしのMySQL接続文字列はjdbc:mysql://localhost:3306/DB_NAME_HERE?autoReconnect=true&useTimezone=false&rewriteBatchedStatements=true

マイjpaContext.xmlは(私は全部を省略して、ちょうど私の部分を含めてることでこれを持っていますパラメータを設定する)

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" primary="true"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.jdbc.batch_size">100</prop> 
      <prop key="hibernate.order_inserts">true</prop> 
      <prop key="hibernate.order_updates" >true</prop> 
      <prop key="hibernate.jdbc.fetch_size" >400</prop> 
      <prop key="hibernate.jdbc.batch_versioned_data" >true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="JpaPersistenceUnit" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false"/> 
      <property name="generateDdl" value="false"/> 
      <property name="database" value="MYSQL"/> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.jdbc.batch_size">100</prop> 
      <prop key="hibernate.order_inserts">true</prop> 
      <prop key="hibernate.order_updates" >true</prop> 
      <prop key="hibernate.jdbc.fetch_size" >400</prop> 
      <prop key="hibernate.jdbc.batch_versioned_data" >true</prop> 
     </props> 
    </property> 
</bean> 

マイpersistance.xmlこの

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="JpaPersistenceUnit"> 
     <properties> 
      <property name="hibernate.session_factory.interceptor" value="com.siftit.startup.HibernateInterceptor" /> 
      <property name="hibernate.jdbc.batch_size" value="100"/> 
      <property name="hibernate.order_inserts" value="true"/> 
      <property name="hibernate.order_updates" value="true"/> 
      <property name="hibernate.jdbc.fetch_size" value="400"/> 
      <property name="hibernate.jdbc.batch_versioned_data" value="true"/> 
     </properties> 
    </persistence-unit> 
    <persistence-unit name="warehousePersistenceUnit"/> 
</persistence> 
のように見えます

それぞれの分野でパラメータが重複している理由は、どこに属しているのか把握しようとしていたからです。

ここでの設定のための休止状態のログ出力です:誰もが他の人のが動作しているようですので、私がこれまで試した

18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - SessionFactory name : null 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Automatic flush during beforeCompletion(): enabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Automatic session close at end of transaction: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Statistics: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Deleted entity synthetic identifier rollback: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Default entity-mode: pojo 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Check Nullability in Core (should be disabled when Bean Validation is on): enabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Allow initialization of lazy state outside session : disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Using BatchFetchStyle : LEGACY 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Default batch fetch size: -1 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Maximum outer join fetch depth: 2 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Default null ordering: NONE 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Order SQL updates by primary key: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Order SQL inserts for batching: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - multi-tenancy strategy : NONE 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JTA Track by Thread: enabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Query language substitutions: {} 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JPA query language strict compliance: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Named query checking : enabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Second-level cache: enabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Second-level query cache: disabled 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Second-level query cache factory: [email protected] 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Second-level cache region prefix: null 
18:38:03,975 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Optimize second-level cache for minimal puts: disabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Structured second-level cache entries: disabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Second-level cache direct-reference entries: disabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Automatic eviction of collection cache: disabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JDBC batch size: 15 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JDBC batch updates for versioned data: enabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Scrollable result sets: enabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Wrap result sets: disabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JDBC3 getGeneratedKeys(): enabled 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - JDBC result set fetch size: null 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Connection release mode: ON_CLOSE 
18:38:03,991 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG       org.hibernate.cfg.Settings: - Generate SQL with comments: disabled 

すべてが失敗した、と私は愚かな何かをしなければならないように思えるが、私は運がなかった。

+1

あなたはそれが機能しないと思いますか?あなたの 'persistence.xml'には2つの永続ユニットが含まれています。 1つはバッチ処理なし、もう1つはバッチ処理なし。 Springで必要としない 'persistence.xml'を完全に削除することをお勧めします。 'JpaTransactionManager'のプロパティは最も良く取り除かれ、' LocalContainerEntityManagerFactory'に残しておくだけです。今実際にこの設定とスプリング構成のインスタンスを使用しているか、コード内に新しいインスタンスを作成していますか? –

+0

ありがとう、私は、設定のロギングが重複していることに気づいた、私は他の永続的なユニットを見ていて、値が通過していた。情報をありがとう、私は不要なデータを削除します。 – Zipper

答えて

0

効率的な挿入と更新が必要な場合は、少なくとも2つのことが必要です。

は、すべてのエンティティが、あなたがIDの生成のための自動インクリメントを使用する場合は、それぞれのインサートは、それがSQL文字列を所有しなければならない、とJPAを行う必要がありますTableGeneratedのid

@TableGenerator(name="USER_GENERATOR", table="SEQUENCE", pkColumnName="SEQ_NAME", 
     valueColumnName="SEQ_COUNT", pkColumnValue="USER_SEQ", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "USER_GENERATOR") 

を使用していることを確認してください自動インクリメントIDを取得するLAST_INSERT_ID()を選択、各インサートの後。私の推測では、ドライバによって単にhibernate.jdbc.fetch_sizeが無視されるということです。

最新のMySQL JDBCドライバでこれを試したことはありませんが、JDBC URLにrewriteBatchedStatements=trueを含めることによって、ドライバにバッチステートメントを書き直すように伝える必要がありました。あなたがそれをしなかった場合は、バッチで多くの挿入を受けるかもしれないが、すべての挿入がすべての列名が含まれます、そして、あなたはInsert into Table (columns...) Values (values..., values...,)

編集の利益得ることはありません。あるのMySQL JDBC documentationによる を有効なオプションは2つだけです。すべての行を結果セットの先頭に読み込むか、その時点でカーソルを1行使用して行を読み込みます。私の推測では、ドライバによって単にhibernate.jdbc.fetch_sizeが無視されるということです。

+0

私が今持っているコアの問題は、休止状態が渡しているパラメータを尊重していないということです。理由は分かりません。 – Zipper

+0

私はMySQLのドキュメントを読んだ後、私の答えを編集しました。 –

0

hibernate.jdbc.batch_size Hibernateが使用する基本JDBC接続でバッチ処理を設定します。

これに加えて、更新/挿入を一括して実行する方法を実装する必要があります。

EntityManager em = getEntityManager(); 
int batchSize = 1000; 
for (int i = 0; i < persons.size(); i++) { 
    Person person = persons.get(i); 
    em.persist(person); 
    if(i % batchSize == 0) { 
     em.flush(); 
     em.clear(); 
    } 
} 
em.flush(); 
em.clear(); 
+0

私が今持っているコアの問題は、休止状態が渡しているパラメータを尊重していないということです。理由は分かりません。 – Zipper

関連する問題