spring / hibernate mysql配置可获得最佳性能

时间:2015-06-04 10:46:52

标签: spring hibernate ehcache

我应该如何在applicaton-context.xml中配置mysql驱动程序和hibernate属性以获得最佳性能?你有什么改进建议吗?你对我的配置怎么说?
应用context.xml中

<!-- Data Source Declaration -->
<bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"
        value="jdbc:mysql://localhost:3306/oys?characterEncoding=UTF-8" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

<!-- Session Factory Declaration -->
<bean id="SessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    scope="singleton">
    <property name="dataSource" ref="DataSource" />
    <property name="packagesToScan">
        <list>
            <value>spring.dao</value>
            <value>spring.model</value>
            <value>spring.service</value>
            <value>spring.other</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
            </prop>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            <prop key="use_sql_comments">true</prop>
            <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
            <prop key="hibernate.connection.autocommit">true</prop>
            <prop key="net.sf.ehcache.configurationResourceName">/myehcache.xml</prop>
        </props>
    </property>
</bean>

myehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">

    <diskStore path="java.io.tmpdir/ehcache" />

    <defaultCache maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30"
        maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU" statistics="true">
        <persistence strategy="localTempSwap" />
    </defaultCache>
m
    <cache name="forExample" maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="5" timeToLiveSeconds="10">
        <persistence strategy="localTempSwap" />
    </cache>

    <cache name="org.hibernate.cache.internal.StandardQueryCache"
        maxEntriesLocalHeap="5" eternal="false" timeToLiveSeconds="120">
        <persistence strategy="localTempSwap" />
    </cache>

    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
        maxEntriesLocalHeap="5000" eternal="true">
        <persistence strategy="localTempSwap" />
    </cache>
</ehcache>

的pom.xml

<spring.version>4.0.5.RELEASE</spring.version>
<spring.security.version>3.2.5.RELEASE</spring.security.version>
<spring.webflow.version>2.4.1.RELEASE</spring.webflow.version>
<myfaces.version>2.2.7</myfaces.version>
<hibernate.version>4.3.6.Final</hibernate.version
<commons.dbcp.version>1.4</commons.dbcp.version>
<mysql.connector.version>5.1.31</mysql.connector.version>

我目前正在使用本地机器(16gb Ram,i7,ssd磁盘)。我希望从我的网络应用程序中获得最佳性能。但我没有足够的知识和经验来处理这份工作。请给我建议它。(版本,驱动程序类,hibernate属性,ehcache properties..etc)感谢您的建议..

1 个答案:

答案 0 :(得分:2)

您好我会尝试提出一些我认为可以带来更好表现的事情: -

1. 减少主键生成开销
在“插入密集型”流程中,主键生成策略的选择可能非常重要。生成id的一种常用方法是使用数据库序列,通常每个表一个

2. 使用JDBC批量插入/更新
对于批处理程序,JDBC驱动程序通常提供优化以减少名为“JDBC批处理插入/更新”的网络往返 这是活动批量插入/更新所需的实体管理器工厂配置:

 <prop key="hibernate.jdbc.batch_size">150</prop>
 <prop key="hibernate.order_inserts">true</prop>
 <prop key="hibernate.order_updates">true</prop>

仅设置JDBC批处理大小不起作用 3. 定期刷新并清除休眠会话

 应该尽可能避免长时间运行的会话,但如果由于某种原因需要它们,这就是如何控制内存消耗:

entityManager.flush();
entityManager.clear();

flush将触发新实体的插入以发送到数据库。清除会话中的新实体。

4. 减少Hibernate脏检查开销
Hibernate在内部使用一种机制来跟踪被称为脏检查的被修改实体。
Hibernate最大限度地将脏检查的性能成本保持在最低限度,并且仅在需要时进行脏检查,但是机制确实有成本,这在具有大量列的表中更明显。一种方法是

@Transactional(readOnly=true)
public void someMethod() {}

Ways to avoid dirty checking

5. 使用二级和查询缓存
如果某些数据被识别为符合缓存条件,请尝试使用二级缓存。 Setup and disadvantages of second level cache

6. 搜索“坏”查询
不好的查询就像是例如 全表扫描:当桌子被完全扫描时它们发生。一些投影 完整的笛卡尔连接:这意味着正在计算几个表的完整笛卡尔积。

7. 查看表索引。

随着应用程序和模式的增长,检查索引变得更加复杂,ORM工具无法自动为您定义索引。要检查索引,请启用show_sql并检查SQL语句,如果where子句中的属性具有正确的索引。另外,请检查是否在外键上创建了索引。简而言之,不要相信您的ORM工具会自动为您定义索引。如果可能,请使您的索引列不可为空。