论坛首页 Java版 企业应用

请教:compass+spring+hibernate2能否对多表建立索引?

浏览 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;
        }
}
   
时间:2007-06-13
我也遇到类似问题,

我是通过 org.compass.spring.web.mvc.CompassIndexController 来创建索引的,结果也是停止响应.

我的表有50多个.

强行中止后,发现%TEMP%目录下面一堆lucene生成的临时文件.
   
0 请登录后投票
时间:2007-06-14
codeutil 写道


我也遇到类似问题,

我是通过 org.compass.spring.web.mvc.CompassIndexController 来创建索引的,结果也是停止响应.

我的表有50多个.

强行中止后,发现%TEMP%目录下面一堆lucene生成的临时文件.

我这里也有一些在TEMP目录中也有一些这样的文件。应该是lucene生成的锁。那你解决这个问题了吗?
   
0 请登录后投票
时间:2007-06-14
我调出了最后输出的DEBUG日志,请看看是什么问题导致挂起了
具体信息在附件中
  • Debug信息.rar (7.1 KB)
  • 描述: tomcat5下的Debug信息和JAVACODE
  • 下载次数: 17
   
0 请登录后投票
时间: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]

   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐