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