我应该如何在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)感谢您的建议..
答案 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工具会自动为您定义索引。如果可能,请使您的索引列不可为空。