У меня есть то, что кажется очень странной проблемой. Мое приложение работает достаточно хорошо, и я в процессе его оптимизации (я унаследовал его от других разработчиков).Класс не найден: не удалось загрузить com.microsoft.sqlserver.jdbc.Nanos
Проект использует Hibernate 4 с MS SQL Server и работает на Tomcat 8 с использованием Primefaces. Недавно я вернулся и начал использовать ленивую загрузку (предыдущие разработчики установили всю ленивую загрузку на false) с помощью LazyDateModel от Primefaces и возникли проблемы с возвратом в рабочее состояние. Большинство из них я могу исправить самостоятельно, но это меня заводит.
<query name="assayByLineAndDateRange">
<![CDATA[from Assay a where a.line.number = :line and a.time >= :startDate
and a.time < :endDate order by a.time DESC]]>
</query>
выше запрос HQL приведет к возможной ClassNotFoundException
для com.microsoft.sqlserver.jdbc.Nanos
, который я уже подтвержденного присутствовать в моем пути к классам проекта.
Теперь для странной части: когда я удалить and
условия запроса, приложение работает нормально, например, так:
<query name="assayByLineAndDateRange">
<![CDATA[from Assay a where a.line.number = :line order by a.time DESC]]>
</query>
Точная проблема возникает, когда я называю query.iterate() в моем Util класс, и я не понимаю, почему. Вот фрагмент кода, о котором идет речь:
protected List<T> getList(Query query) {
List<T> list = new ArrayList<T>();
System.out.println("Query name: " + query.getQueryString());
try {
@SuppressWarnings("rawtypes")
Iterator i = query.iterate();
System.out.println("This line does not print");
while(i.hasNext()) {
list.add(getNext(i));
}
return list;
} catch(Exception e) {
System.out.println("CAUSE: " + e.getCause().toString());
e.printStackTrace();
return null;
}
Обратите внимание, что этот код работает прекрасно для буквально любого другого запроса, в том числе запросов, использующих оператор and
.
Вот соответствующие части файла отображения из Пробирной:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.app.gen.model.data.Assay" table="ASSAY" schema="GEN">
<id name="id" type="java.lang.Long" unsaved-value="0">
<column name="ID" precision="10" scale="0"/>
<generator class="identity"/>
</id>
<property name="time" type="timestamp">
<column name="TIME" not-null="true" unique="true"/>
</property>
<many-to-one name="line" class="com.app.gen.model.data.Line" cascade="none">
<column name="LINE_ID" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>
Кроме того, я проверил параметры, чтобы гарантировать, что они пропускают правильно и они. Кроме того, этот запрос работал отлично, прежде чем я начал выполнять ленивую загрузку. Вот перегружен load
метод отложенной загрузки в Primefaces DataTable:
@Override
public List<Assay> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
try {
if(null==lineAssays)
lineAssays = new HashMap<Integer,List<Assay>>();
if(null == lineAssays.get(getLineNumber())) {
if(log.isDebugEnabled()) { log.debug("Fetching Line Assays..."); }
List<Assay> assays = GenServiceFactory.create().fetchAssaysByLineAndDateRange(getLineNumber(), getStartDate(), getEndDate());
lineAssays.put(getLineNumber(),assays);
}
} catch(Exception e) {
System.out.println("AN ERROR OCCURED!");
e.printStackTrace();
}
try {
int numAssays = lineAssays.get(getLineNumber()).size();
this.setRowCount(numAssays);
if(numAssays > pageSize) {
try {
return lineAssays.get(line).subList(first, first + pageSize);
}
catch(IndexOutOfBoundsException e) {
return lineAssays.get(line).subList(first, first + (numAssays % pageSize));
}
}
else {
return lineAssays.get(line);
}
} catch(NullPointerException e1) {
System.out.println("lineAssays is null");
}
return null;
}
Вот трассировки стека из исключения:
DEBUG (2015-02-03 14:57:50) [http-apr-8080-exec-34] (LazyAssayLoader.java:72) - Fetching Line Assays...
Query name:
from Assay a where a.line.number = :line and a.time >= :startDate and a.time < :endDate order by a.time DESC
CAUSE: java.lang.ClassNotFoundException
java.lang.IllegalStateException: Can't overwrite cause with java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load com.microsoft.sqlserver.jdbc.Nanos. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
at java.lang.Throwable.initCause(Throwable.java:457)
at org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1331)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1212)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1173)
at com.microsoft.sqlserver.jdbc.TDSWriter.writeScaledTemporal(IOBuffer.java:4278)
at com.microsoft.sqlserver.jdbc.TDSWriter.writeRPCDateTime2(IOBuffer.java:4184)
at com.microsoft.sqlserver.jdbc.DTV$SendByRPCOp.sendTemporal(dtv.java:584)
at com.microsoft.sqlserver.jdbc.DTV$SendByRPCOp.execute(dtv.java:356)
at com.microsoft.sqlserver.jdbc.DTV.executeOp(dtv.java:1025)
at com.microsoft.sqlserver.jdbc.DTV.sendByRPC(dtv.java:1116)
at com.microsoft.sqlserver.jdbc.Parameter.sendByRPC(Parameter.java:660)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.sendParamsByRPC(SQLServerPreparedStatement.java:473)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doPrepExec(SQLServerPreparedStatement.java:628)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:400)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1716)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2040)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1837)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816)
at org.hibernate.loader.hql.QueryLoader.iterate(QueryLoader.java:518)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.iterate(QueryTranslatorImpl.java:399)
at org.hibernate.engine.query.spi.HQLQueryPlan.performIterate(HQLQueryPlan.java:245)
at org.hibernate.internal.SessionImpl.iterate(SessionImpl.java:1331)
at org.hibernate.internal.QueryImpl.iterate(QueryImpl.java:68)
at com.core.service.HibernateService$AbstractHQLQuery.getList(HibernateService.java:120)
at com.core.service.HibernateService$AbstractHQLQuery.getList(HibernateService.java:138)
at com.urenco.iphex.service.IphexService.fetchAssaysByLineAndDateRange(IphexService.java:77)
at com.urenco.iphex.view.lazy.LazyAssayLoader.load(LazyAssayLoader.java:73)
at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:731)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:79)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:63)
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47)
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:202)
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:119)
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:56)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at org.primefaces.component.tabview.TabViewRenderer.encodeTabContent(TabViewRenderer.java:274)
at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:253)
at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:127)
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:71)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at com.sun.faces.renderkit.html_basic.CompositeRenderer.encodeChildren(CompositeRenderer.java:78)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:518)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1612)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:297)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:409)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:616)
lineAssays is null
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException
at org.apache.catalina.loader.WebappClassLoader.checkStateForClassLoading(WebappClassLoader.java:1330)
... 103 more
Извините за стену текста, но любая помощь очень ценится!
Джон, спасибо за ответ. Я столкнулся с этой ошибкой, прежде чем простой перезапуск очистит ее. Однако с этим конкретным запросом это происходит в 100% случаев.Мне просто кажется, что это так странно, что он отлично работает, когда я удаляю дополнительные условия. –
UPDATE: Джон, я изучал то, что вы сказали о старых версиях, которые были кешированы, поэтому я устал несколько разных вещей, чтобы, возможно, очистить расхождение. Я думаю, проблема кроется в том, как Netbeans развертывает/запускает проект на сервер. Я закрыл Netbeans и запустил приложение со страницы менеджера Tomcat, и это сработало. Поэтому я предполагаю, что это временный обходной путь, хотя я не уверен, почему сокращение запроса привело к разнице. Спасибо за вашу помощь! –
Надеюсь, он работает. Вы должны сосредоточить свое исследование на базовом сообщении: «java.lang.IllegalStateException: Незаконный доступ: этот экземпляр веб-приложения уже остановлен». –