浏览 1941 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-06-13
目前系统采用struts+spring1.2+hibernate2作为架构,采用compass1.1+lucene作为搜索引擎。对5个表可以进行索引,并且查询没有问题,但对5个以上表进行索引时发现一个问题,系统没有报任何异常,compass始终没有建立索引,并且没有释放session,导致系统无法使用。后台代码如下:
信息: Starting Coyote HTTP/1.1 on port 8080 498843 [Compass Indexer] INFO com.gwssi.police.framework.component.lucene.businessservice.CompassIndexBuilder - begin compass index... 502500 [Compass Indexer] INFO org.compass.core.lucene.engine.optimizer.ScheduledLuceneSearchEngineOptimizer - Stopping scheduled optimizer [class org.compass.core.impl.DefaultCompass$TransactionalSearchEngineOptimizer] 502515 [Compass Indexer] INFO org.compass.core.lucene.engine.manager.ScheduledLuceneSearchEngineIndexManager - Stopping scheduled index manager 507875 [Compass Indexer] INFO org.compass.core.lucene.engine.highlighter.LuceneHighlighterManager - Building highlighter [default] 到最后一行就不再输出任何信息了。 对5个表以下进行索引的时候后台代码如下,可以正常建立索引文件: 信息: Starting Coyote HTTP/1.1 on port 8080 85562 [Compass Indexer] INFO com.gwssi.police.framework.component.lucene.businessservice.CompassIndexBuilder - begin compass index... 86406 [Compass Indexer] INFO org.compass.core.lucene.engine.optimizer.ScheduledLuceneSearchEngineOptimizer - Stopping scheduled optimizer [class org.compass.core.impl.DefaultCompass$TransactionalSearchEngineOptimizer] 86422 [Compass Indexer] INFO org.compass.core.lucene.engine.manager.ScheduledLuceneSearchEngineIndexManager - Stopping scheduled index manager 87890 [Compass Indexer] INFO org.compass.core.lucene.engine.highlighter.LuceneHighlighterManager - Building highlighter [default] Hibernate: select * from ( 此处省略sql代码) where rownum <= ? Hibernate: 此处省略sql代码 104234 [Compass Indexer] INFO org.compass.core.impl.DefaultCompass - Closing Compass [compass] 104234 [Compass Indexer] INFO org.compass.core.lucene.engine.manager.ScheduledLuceneSearchEngineIndexManager - Stopping scheduled index manager 104234 [Compass Indexer] INFO org.compass.core.impl.DefaultCompass - Closed Compass [compass] 104234 [Compass Indexer] INFO org.compass.core.lucene.engine.optimizer.ScheduledLuceneSearchEngineOptimizer - Starting scheduled optimizer [class org.compass.core.impl.DefaultCompass$TransactionalSearchEngineOptimizer] with period [10000ms] daemon [true] 104234 [Compass Indexer] INFO org.compass.core.lucene.engine.manager.ScheduledLuceneSearchEngineIndexManager - Starting scheduled index manager with period [60000ms] daemon [true] 104234 [Compass Indexer] INFO com.gwssi.police.framework.component.lucene.businessservice.CompassIndexBuilder - compss index finished. 104234 [Compass Indexer] INFO com.gwssi.police.framework.component.lucene.businessservice.CompassIndexBuilder - costed 18672 milliseconds applicationContext.xml配置如下
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="mappingResources">
<list>
<value>a.hbm.xml</value>
<value>此处省略部分代码</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<!--COMPASS===========start-->
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<property name="resourceLocations">
<list>
<value>classpath:cfg/compass.cmd.xml</value>
<value>classpath:cpm/a.cpm.xml</value>
<value>classpath:cpm/b.cpm.xml</value>
<value>classpath:cpm/c.cpm.xml</value>
<value>classpath:cpm/d.cpm.xml</value>
<value>classpath:cpm/e.cpm.xml</value>
</list>
</property>
<property name="compassSettings">
<props>
<prop key="compass.engine.connection">file://${user.home}/compass</prop>
<prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
<prop key="compass.engine.highlighter.default.formatter.simple.pre">
<![CDATA[<font color="red"><b>]]>
</prop>
<prop key="compass.engine.highlighter.default.formatter.simple.post">
<![CDATA[</b></font>]]>
</prop>
</props>
</property>
<property name="transactionManager">
<ref local="transactionManager" />
</property>
</bean>
<bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.Hibernate2GpsDevice">
<property name="name"><value>hibernateDevice</value></property>
<property name="sessionFactory"><ref local="sessionFactory" /></property>
</bean>
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
<property name="compass"><ref bean="compass" /></property>
<property name="gpsDevices">
<list>
<bean class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
<property name="gpsDevice"><ref bean="hibernateGpsDevice" /></property>
</bean>
</list>
</property>
</bean>
<bean id="compassSearchService" class="com.framework.component.lucene.businessservice.CompassSearchService">
<property name="compass">
<ref local="compass"/>
</property>
<property name="pageSize">
<value>20</value>
</property>
</bean>
<!-- 自动随Spring ApplicationContext启动而重建索引 -->
<bean id="compassIndexBuilder" class="com.framework.component.lucene.businessservice.CompassIndexBuilder" lazy-init="false">
<property name="compassGps">
<ref local="compassGps"/>
</property>
<property name="buildIndex">
<value>true</value>
</property>
<property name="lazyTime">
<value>50</value>
</property>
</bean>
<!--COMPASS===========END-->
compass.cmd.xml代码
<?xml version="1.0"?>
<!DOCTYPE compass-core-meta-data PUBLIC
"-//Compass/Compass Core Meta Data DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd">
<compass-core-meta-data>
<meta-data-group id="test" displayName="test">
<description>测试</description>
<alias id="a" displayName="a">
<description>a</description>
<name>a</name>
</alias>
<alias id="b" displayName="b">
<description>b</description>
<name>b</name>
</alias>
<alias id="c" displayName="c">
<description>c</description>
<name>c</name>
</alias>
<alias id="d" displayName="d">
<description>d</description>
<name>d</name>
</alias>
<alias id="e" displayName="e">
<description>e</description>
<name>e</name>
</alias>
<meta-data id="name" displayName="名称">
<description>名称</description>
<name>name</name>
</meta-data>
<meta-data id="content" displayName="内容">
<description>内容</description>
<name>content</name>
</meta-data>
</meta-data-group>
</compass-core-meta-data>
CompassIndexBuilder.java代码如下:
public class CompassIndexBuilder implements InitializingBean {
private static final Logger log = Logger.getLogger(CompassIndexBuilder.class);
// 是否需要建立索引,可被设置为false使本Builder失效.
private boolean buildIndex = true;
// 索引操作线程延时启动的时间,单位为秒
private int lazyTime = 50;
// Compass封装
private CompassGps compassGps;
// 索引线程
private Thread indexThread = new Thread() {
public void run() {
try {
Thread.sleep(lazyTime * 1000);
log.info("begin compass index...");
long beginTime = System.currentTimeMillis();
// 重建索引.
// 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引,
// 索引完成后再进行覆盖.
compassGps.index();
long costTime = System.currentTimeMillis() - beginTime;
log.info("compss index finished.");
log.info("costed " + costTime + " milliseconds");
} catch (InterruptedException e) {
// simply proceed
}
}
};
/**
* 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程.
*
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
if (buildIndex) {
Assert.notNull(compassGps, "CompassIndexBuilder not set CompassGps yet.");
indexThread.setDaemon(true);
indexThread.setName("Compass Indexer");
indexThread.start();
}
}
public void setBuildIndex(boolean buildIndex) {
this.buildIndex = buildIndex;
}
public void setLazyTime(int lazyTime) {
this.lazyTime = lazyTime;
}
public void setCompassGps(CompassGps compassGps) {
this.compassGps = compassGps;
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-06-13
我也遇到类似问题,
我是通过 org.compass.spring.web.mvc.CompassIndexController 来创建索引的,结果也是停止响应. 我的表有50多个. 强行中止后,发现%TEMP%目录下面一堆lucene生成的临时文件. |
|
| 返回顶楼 | |
|
时间:2007-06-14
codeutil 写道 我也遇到类似问题, 我是通过 org.compass.spring.web.mvc.CompassIndexController 来创建索引的,结果也是停止响应. 我的表有50多个. 强行中止后,发现%TEMP%目录下面一堆lucene生成的临时文件. |
|
| 返回顶楼 | |
|
时间:2007-06-14
我调出了最后输出的DEBUG日志,请看看是什么问题导致挂起了
具体信息在附件中 |
|
| 返回顶楼 | |
|
时间:2007-06-14
将dataSource改为Spring提供的类,或者设置dbcp.BasicDataSource的初始连接数就解决了不能建立索引的问题,自己理解应该是compass根据需要索引表的数量打开多个进程,去调用dataSource;但dbcp.BasicDataSource的默认初始连接数不够大,也没有能及时打开连接,造成进程的锁定。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
或者:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="initialSize">
<value>50</value>
</property>
</bean>
把log4j的级别调成DEBUG,发现COMPASS会在后台不断的输出下面的代码,大家也是如此吗: 2007-06-14 16:24:57,125 DEBUG org.compass.core.lucene.engine.manager.ScheduledLuceneSearchEngineIndexManager - Checking for global cache invalidation 2007-06-14 16:24:57,140 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled IndexManager] with isolation [null] 2007-06-14 16:24:57,140 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled IndexManager] 2007-06-14 16:24:57,203 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled IndexManager] 2007-06-14 16:24:57,218 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled IndexManager] with isolation [null] 2007-06-14 16:24:57,218 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled IndexManager] 2007-06-14 16:24:57,218 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled IndexManager] 2007-06-14 16:24:57,390 DEBUG org.compass.core.lucene.engine.optimizer.ScheduledLuceneSearchEngineOptimizer - Checking for index optimization 2007-06-14 16:24:57,390 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled Optimizer] with isolation [null] 2007-06-14 16:24:57,390 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled Optimizer] with isolation [null] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled Optimizer] with isolation [null] 2007-06-14 16:24:57,406 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,421 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,421 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Beginning new Spring transaction, and a new compass transaction on thread [Compass Scheduled Optimizer] with isolation [null] 2007-06-14 16:24:57,421 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing Spring transaction controlled by compass on thread [Compass Scheduled Optimizer] 2007-06-14 16:24:57,421 DEBUG org.compass.spring.transaction.SpringSyncTransaction - Committing compass transaction using Spring synchronization afterCompletion on thread [Compass Scheduled Optimizer] |
|
| 返回顶楼 | |




