solr 数据导入处理程序 jndi websphere
Posted
技术标签:
【中文标题】solr 数据导入处理程序 jndi websphere【英文标题】:solr dataimport handler jndi websphere 【发布时间】:2012-04-05 03:15:51 【问题描述】:我正在尝试在 db-data-config.xml 中使用 jndiName 属性。这在tomcat中效果很好。但是在 websphere 中存在问题。
以下异常被抛出
“确保 J2EE 应用程序不会在静态代码块或由该 J2EE 应用程序创建的线程中对“java:”名称执行 JNDI 操作。此类代码不一定在服务器应用程序请求的线程上运行,因此对“java:”名称的 JNDI 操作不支持。[根异常是 javax.naming.NameNotFoundException:在上下文“java:”中找不到名称 comp/env/jdbc。”
似乎 websphere 从静态代码访问 jndi 资源时出现问题。有没有人经历过这个?
DataImporter E org.apache.solr.common.SolrException log Full Import failed:org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: <REMOVE SQL from here>
at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:72)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:253)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:210)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:39)
at org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59)
at org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:73)
at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:238)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:596)
at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:268)
at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:187)
at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:359)
at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:427)
at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:408)
Caused by: javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component. This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request. Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application. Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".]
at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:428)
at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:399)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:214)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:154)
at javax.naming.InitialContext.lookup(InitialContext.java:436)
at org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:140)
at org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:128)
at org.apache.solr.handler.dataimport.JdbcDataSource.getConnection(JdbcDataSource.java:363)
at org.apache.solr.handler.dataimport.JdbcDataSource.access$200(JdbcDataSource.java:39)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:240)
... 11 more
Caused by: javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".
at com.ibm.ws.naming.ipbase.NameSpace.getParentCtxInternal(NameSpace.java:1837)
at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1166)
at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.java:1095)
at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1233)
at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:395)
... 19 more
【问题讨论】:
是的,我看到了在静态初始化程序或构造函数中执行“java:”查找的问题。什么是 db-data-config.xml?你看到什么问题?请包括示例代码、日志中的错误消息或完整的异常堆栈跟踪(如果相关)。 我在这里添加了堆栈跟踪。 db-data-config.xml 是用于从数据库导入到 Apache Solr 的配置文件。 【参考方案1】:Solr 在这里使用非托管线程,并在其中一个线程的 java: 命名空间中进行 JNDI 查找。这在 WebSphere 中不受支持,因为 WebSphere 根据执行查找的线程来识别 java: 名称空间。 Tomcat 基于线程上下文类加载器来执行此操作,这解释了行为上的差异。请注意,J2EE 规范不允许非托管线程,因此 WebSphere 的行为实际上是符合标准的。
【讨论】:
谢谢,现在使用 jndiName="jdbc/testdb" 代替 jndiName="java:comp/env/jdbc/testdb"。以上是关于solr 数据导入处理程序 jndi websphere的主要内容,如果未能解决你的问题,请参考以下文章