2013-09-19 2 views
0

В моей заявке я использую весну 3.2.4, hibernate 4.2.5, postgres 9.2.2. Таблицы отображаются через аннотацию объекта и создаются с помощью hibernate.hbm2ddl.auto = update в postgres.Насколько сложный ключ в postgres влияет на производительность гибернации? Вместо оболочки я использую искусственный первичный ключ?

Приложение часто обновляет базу данных, если нет записи, она создается тогда. Postgres по умолчанию создает автоматические индексы по первичным ключам.

1. Выполняет ли Postgres поиск по составному первичному ключу с такой же скоростью, как и с одним столбцом первичного ключа?

2. В этом подходе отсутствует ли снижение производительности для спящего режима по сравнению с одноколоночными ключами?

Заранее спасибо

Код:

Композитный Ключ:

@Embeddable 
public class MyRecordKey implements Serializable{ 

private static final long serialVersionUID = -4966351432123537568L; 
/** 
* In what interwal it was saved 
*/ 
private String dateAndTime; 

/** 
* name 
*/ 
private String name; 

     ...setters and getters ommited 

@Override 
public int hashCode() { 
    ...code ommited 
} 

@Override 
public boolean equals(Object obj) { 
      ...code ommtited 
} 



} 

Таблица:

@Entity 
public class MyRecord { 

@EmbeddedId 
private MyRecordKey myRecordKey; 

    ...getters, setters and othey attributes ommited 
} 

Dao Класс:

@Transactional 
@Repository 
public class SaveMyElements { 

@Autowired 
private SessionFactory sessionFactory; 

public void saveElements(List<MyRecord> myRecordList) { 
    Session session = sessionFactory.getCurrentSession(); 
     for (MyRecord chr : myRecordList) { 
      session.saveOrUpdate(chr); 
        } 

} 

Datasource.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

<tx:annotation-driven transaction-manager="transactionManager"/> 


<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 

    <property name="driverClass" value="${app.driverClassName}" /> 
    <property name="jdbcUrl" value="${app.url}" /> 
    <property name="user" value="${app.username}" /> 
    <property name="password" value="${app.password}" /> 

    <property name="minPoolSize" value="2" /> 
    <property name="maxPoolSize" value="20" /> 
    <property name="maxIdleTime" value="10" /> 
    <property name="initialPoolSize" value="10" /> 

    <property name="idleConnectionTestPeriod" value="200" /> 
    <property name="checkoutTimeout" value="10000" /> 
    <property name="unreturnedConnectionTimeout" value="600" /> 
    <property name="automaticTestTable" value="conTest" /> 
    <property name="testConnectionOnCheckin" value="true" /> 
</bean> 

<context:property-placeholder location="classpath:db.properties" /> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="org.my.myreader.hibernate.entity" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

ApplicationServlet-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:task="http://www.springframework.org/schema/task" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 


<context:annotation-config /> 

<context:spring-configured /> 
<context:load-time-weaver /> 

<context:component-scan base-package="org.my.myreader"/> 
<import resource="classpath:datasource.xml"/> 
    <import resource="classpath:spring-scheduler.xml"/> 
</beans> 

ответ

0

Да, один столбец, чисто технические, автоматически генерируемые первичные ключи должны быть предпочтительным. В целях повышения производительности, но и по причинам технического обслуживания:

  1. Ввод функциональных атрибутов в ПК мешает вам когда-либо изменения их значений
  2. Каждый объект, имеющий ссылку на MyRecord будет также иметь эти две колонки.
  3. Каждая ссылка, которую вы создаете в yor webapp, должна иметь два параметра вместо одного, чтобы идентифицировать адрес записи в приложении.
  4. Все, от вашего приложения до базы данных, понадобится больше места на диске/памяти и будет медленнее (индекс на числовом столбце более эффективен, чем индекс на двух отдельных столбцах, особенно на varchar)
  5. Вы страдают при сопоставлении и запросе этого объекта и всех других, ссылающихся на него.

...

+0

Спасибо за ответ этот сложный вопрос @JB Nizet :) Если я правильно понимаю, то лучше было бы создать искусственный ключ и отметить мой текущий первичный ключ в качестве уникальных «близнецов», как описано здесь ? http://stackoverflow.com/questions/3211972/specifying-restrictions-unique-together-in-hibernate – user2334968

Смежные вопросы