Compass实例的唯一必要配置就是它的connection.
connection控制着索引将保存在那里,换一句话说就是索引的存储路径。
有下面几种存储方式:
1 文件系统存储
到目前为止,最受欢迎的而且是最简单的存储方法是在文件系统上保持索引,下面是一个基于connection配置的
简单文件系统例子,将索引保存在target/test-index路径下 <compass name="default"> <connection> <file path="target/test-index"/> </connection> </compass> compass.engine.connection=file://target/test-index
另一种文件系统方法的配置是基于使用Java 1.4 NIO mmap特性
<compass name="default"> <connection> <mmap path="target/test-index"/> </connection> </compass> compass.engine.connection=mmap://target/test-index <compass name="default"> <connection> <niofs path="target/test-index"/> </connection> </compass> compass.engine.connection=niofs://target/test-index
2 随机存储
使用随机存储器的索引存储,索引数据可以保存在内存中。对于存储的代价来说,这样方便快速索引和搜索。
下面是配置的例子:
<compass name="default"> <connection> <ram path="/index"/> </connection> </compass> compass.engine.connection=ram://index
3 JDBC存储
JDBC存储connection类型允许索引数据保存到数据库中。保存索引的机制实际是模仿基于树的文件系统,子索引
表里的每行都代表着一个二进制数据的文件。
Compass实现,JdbCDirectory,它是建立在Lucene directory提取之上的,完全与其他的Compass解耦合,并且能够用于单纯的Lucene应用。当在Compass中使用时,它可以更简单地配置,尤其是事务管理和jdbc数据源管理方面。
下面是一个简单使用jdbc存储索引的例子,例子的配置是假定一个不变的配置,没有数据源池:
<compass name="default"> <connection> <jdbc> <dataSourceProvider> <driverManager url="jdbc:hsqldb:mem:test" username="sa" password="" driverClass="org.hsqldb.jdbcDriver" /> </dataSourceProvider> </jdbc> </connection> </compass>
以上的配置在jdbc元素上没有定义方言属性。Compass将尝试自动检测基于数据库元数据的数据库方言,如果检测
失败,方言将被设置,在我们的例子里,它应该是
dialect="org.apache.lucene.store.jdbc.dialect.HSQLDialect".
(1)管理环境
当达到一个jdbc索引存储的时候了解Compass是否工作在一个“受管理”的环境下是很重要的。一个管理环境是Compass不能控制事务管理的环境。如果Compass可以控制事务,比如说是有本地事务工厂,它就不会被认为是一个管理环境。
如果工作在一个无管理环境下,Compass将会用ransactionAwareDataSourseProxy封装数据源,并且可以提交/回滚 jdbc 连接。当工作在一个管理环境下,不会出现封装,并且Compass将会让外部事务管理者去提交/回滚 连接。
通常,并不是总是,当工作在一个管理环境下,jdbc数据源使用的是来自外部系统/配置。大多数情况下它会是JNDI或外部数据源提供者(比如说Spring)。
默认情况下,Compass工作在非管理环境下,那么jdbc元素的managed属性应该设为true.
(2) 数据源提供者
Compass考虑到不同的jdbc数据源提供者。DataSourceProvider实现的职责是为了配置和提供一个jdbc数据源实例。当谈到性能,尤其是在共享特性的时候,数据源的实现是非常重要的。
所有Compass支持的不同数据源都允许配置自动提交标志。自动提交有三个值:false,true和external(不要明确地设置自动提交,假定它已经在其他位置配置了)。自动提交模式的默认值是false并且是推荐值(external可以使用,但是必须确定将真实数据源设置为false)
a 驱动器管理器
所有提供者里最简单的,不需要任何外部的库或系统。主要的缺点是性能,因为它没有实现任何种类的共享。
b Jakarta Commons DBCP
Compass能够使用Jakarta Commons DBCP作为数据源提供者配置,相对于驱动器管理提供者的性能而言,这是一个推荐的选择,下面是使用时的例子:
<compass name="default"> <connection> <jdbc> <dataSourceProvider> <dbcp url="jdbc:hsqldb:mem:test" username="sa" password="" driverClass="org.hsqldb.jdbcDriver" maxActive="10" maxWait="5" maxIdle="2" initialSize="3" minIdle="4" poolPreparedStatements="true" /> </dataSourceProvider> </jdbc> </connection> </compass>
配置显示不同的设置可以用于dbcp数据源提供者,他们的值没有其他含义,是典型系统的推荐值,想获取更多信息,请查看Jakarta Commons DBCP文档。
c c3p0
Compass可以使用c3p0作为数据源配置,相对于驱动器管理的性能原因,她也是一个推荐的选择(你想使用它或上一节的Jakarta Commons DBCP),这取决于你,下面是使用例子:
<compass name="default"> <connection> <jdbc> <dataSourceProvider> <c3p0 url="jdbc:hsqldb:mem:test" username="testusername" password="testpassword" driverClass="org.hsqldb.jdbcDriver" /> </dataSourceProvider> </jdbc> </connection> </compass>
c3p0数据源提供者将使用c3p0的ComboPooledDataSource,其他另外的设置可以使用c3p0.perperties文件设置,这个文件作为高级资源保存在同一个LASSPATH/classloader加载c3p0的jar文件的位置。请参考c3p0文档获取更多设置。
d JNDI
Compass也可以通过使用JNDI寻找数据源来配置,下面是使用的例子:
<compass name="default"> <connection> <jdbc> <dataSourceProvider> <jndi lookup="testds" username="testusername" password="testpassword" /> </dataSourceProvider> </jdbc> </connection> </compass>
jndi查找环境 ,包括java.naming.factory.initial和java.naming.provider.url的JDNI设置,可以配置在其他的jndi标签内,直接在Compass标签下面,注意,username和password用于数据源,而且是完全可选的。
e 外部
Compass可以使用ExteranlDataSourceProvider.类的外部数据源来配置,它使用java线程本地保存数据源为了之后数据源提供者使用。设置数据源在ExteranlDataSourceProvider上使用静态方法setDataSource(DataSource
dataSource),下面是一个如何配置的例子:
<compass name="default"> <connection> <jdbc> <dataSourceProvider> <external username="testusername" password="testpassword"/> </dataSourceProvider> </jdbc> </connection> </compass>
注意,username和password是用于数据源的,而且是可选的。
还有一些,有时间补上