第一步:使用Jetty的JNDI配置数据源$SOLR_HOME/server/contexts/solr-jetty-context.xml
<New id="jndidmp" class="org.eclipse.jetty.plus.jndi.Resource"> <Arg>jdbc/dmp</Arg> <Arg> <New class="com.mchange.v2.c3p0.ComboPooledDataSource"> <Set name="driverClass">com.mysql.jdbc.Driver</Set> <Set name="jdbcUrl">jdbc:mysql://localhost:3306/dmpreport</Set> <Set name="user">root</Set> <Set name="password">root</Set> <Set name="maxPoolSize">2</Set> <Set name="minPoolSize">1</Set> <Set name="initialPoolSize">1</Set> <Set name="maxIdleTime">60</Set> </New> </Arg> </New>
第二步:在$SOLR_HOME/server/solr-webapp/webapp/WEB-INF/web.xml中注册数据源:
<resource-ref> <description>MY DB Connection</description> <res-ref-name>jdbc/dmp</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
第三步:在DIH的数据源文件($SOLR_HOME/server/solr/dmpreport/conf/db-data-config.xml)中建立DataSource:
<dataSource name="dmpreport" jndiName="jdbc/dmp" type="JdbcDataSource" />
第四步:至此为止,本以为使用了连接池会释放连接,但是仍然不释放,导致后续建索引会卡主,而且不报错,DIH获取不到连接了。。。。真他妈操蛋!
查看Solr的源码发现当获取完一个Entity数据导入完后,不会去关闭connection,然后又去获取connection了。导致connection一直不能释放!
修改源码:org.apache.solr.handler.dataimport.JdbcDataSource.java文件
约180行:将Connection c = null;改成 private static Connection c = null;置为全局变量,放于约72行。
最操蛋的来了:
接下就是将class文件覆盖solr-dataimporthandler-5.5.3.jar中class替换lib下的jar包即可!